【问题标题】:Can't display images from models when debug=false当 debug=false 时无法显示模型中的图像
【发布时间】:2021-02-15 07:01:56
【问题描述】:

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

请帮帮我。非常感谢!

【问题讨论】:

  • Django 在生产中不提供静态/媒体文件(当DEBUG = False 时),因为它效率低下。检查Serving static files in production
  • 我尝试设置静态文件存储,设置 DEBUG = False 时静态文件没有问题,但是当我尝试显示存储在媒体文件夹中的模型中的图像时,它会抛出问题

标签: django image debugging model


【解决方案1】:

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

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
    

    按照此代码,您将解决您的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2017-02-05
      • 2013-12-03
      • 2021-05-18
      • 2012-09-28
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多