首页 > 解决方案 > 当 debug=false 时无法显示模型中的图像

问题描述

我问了另一个关于显示模型图像的问题。这是因为我没有将媒体网址添加到 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'

我的模型.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

请帮帮我。非常感谢 !

标签: djangoimagedebuggingmodel

解决方案


ALLOWED_HOSTS您应该在 settings.py 中插入一些内容,例如:-

ALLOWED_HOSTS = ['*']

或您的网站名称:-

ALLOWED_HOSTS = ['your_website_name']

推荐阅读