Не удается отобразить изображения из моделей, когда debug=false

#django #image #debugging #model

#django #изображение #отладка #Модель

Вопрос:

Я задал еще один вопрос о проблеме отображения изображений с моделей. и это было потому, что я не добавлял медиа-url в urlpatterns. Но оказывается, что это работает только тогда, когда я устанавливаю debug=true в файле настроек, когда я устанавливаю debug=false, я снова получаю ошибку 404, любой эксперт здесь, чтобы помочь? Мне нужно установить debug=false для производства

здесь мой urls.py файл

 from django.contrib import admin
from django.urls import path
from home import views as HomeViews


from django.conf.urls import include, url


from django.conf.urls.static import static
from django.conf import settings
import os
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',HomeViews.index,name='home')
] 
if settings.DEBUG:
    urlpatterns = urlpatterns   static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns = urlpatterns   static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 

мой файл настроек

 from pathlib import Path
import os
import django_heroku
import django
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'ws^pgf$%!=l8y#%^7anp$rl6*o4u9!86g-ba_uq9pcee=vc@13'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'home',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'whitenoise.middleware.WhiteNoiseMiddleware',
]

ROOT_URLCONF = 'testimage.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'testimage.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,"static")]
STATIC_ROOT = os.path.join(BASE_DIR,'staticfiles')


MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

django_heroku.settings(locals())

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
 

мой models.py

 from django.db import models

# Create your models here.
class Images(models.Model):
    photo = models.ImageField(blank=True, null=True, default=None)
    title = models.CharField(max_length=250)
    def __str__(self):
        return self.title
 

представления и шаблон

 from django.shortcuts import render
from home.models import Images
# Create your views here.
def index(request):
    images = Images.objects.all()
    context = {
        'images':images
    }
    return render(request,'home.html',context)
 

шаблон

 {%for i in images %}
<img src="{{MEDIA_URL}}{{i.photo.url}}" alt="">
{%endfor%}
 

Вот ошибка при установке debug=false:

 [15/Feb/2021 13:17:05] "GET /media/20210129_205930.jpg HTTP/1.1" 404 179
[15/Feb/2021 13:17:05] "GET /media/20201227_111422.jpg HTTP/1.1" 404 179
 

Пожалуйста, помогите мне выбраться. Большое спасибо!

Комментарии:

1. Django не обслуживает статические / мультимедийные файлы в рабочей среде (когда DEBUG = False ), потому что это неэффективно. Проверьте обслуживание статических файлов в рабочей среде

2. Я попытался установить хранилище статических файлов, и у меня нет проблем со статическими файлами при установке DEBUG = False, но это вызывает проблемы, когда я пытаюсь отобразить изображения из моделей, которые хранятся в папке мультимедиа

Ответ №1:

Вы должны вставить некоторые ALLOWED_HOSTS в settings.py как :-

 ALLOWED_HOSTS = ['*']
 

или название вашего веб-сайта :-

 ALLOWED_HOSTS = ['your_website_name']
 

Ответ №2:

Я сталкиваюсь с той же проблемой, но решаю эту проблему с помощью этого кода

 pip install whitenoise
 

в settings.py

 DEBUG = False

ALLOWED_HOSTS = ['*']

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
]


MEDIA_URL = '/media/'
STATIC_URL = '/static/'
MEDIA_ROOT = BASE_DIR / "media"
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [(os.path.join(BASE_DIR, 'static'))]

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
 

В urls.py

 from django.urls import path, include, re_path
from django.conf import settings
from django.conf.urls.static import static
from django.views.static import serve

urlpatterns = [
    path('user_area/', admin.site.urls),
    path('ckeditor/', include('ckeditor_uploader.urls')),
    path('', include('main.urls')),
    path('', include('user_area.urls')),
]
urlpatterns  = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns  = [re_path(r'^media/(?P<path>.*)

Следуя этому коду, вы решите свои проблемы



, serve, {'document_root': settings.MEDIA_ROOT, }), ]

python manage.py collectstatic
Следуя этому коду, вы решите свои проблемы