生产模式下 Django 中静态图像和媒体的 404

404 for static images and media in Django in Production Mode

我是 Django 初学者

我正在尝试 运行 我的应用程序在 Debug=False 模式下模拟生产环境,我已经添加了所有静态 url 和根目录。我的程序在 运行 时间内根据传递给应用程序的视频实时生成静态图像。

这在开发模式下按预期工作,但我在生产模式下的图像和视频得到 404,其他东西如 bootstrap 和 JS 正在加载正常。

早些时候 bootstrap 并且 js 也没有加载然后我安装了 Whitenose 并且一切开始工作,但现在图像和视频并给出 404。

Link申请代码:https://github.com/abhijitjadhav1998/Deepfake_detection_using_deep_learning/tree/master/Django%20Application

除此应用程序外,我还在 settings.py

中添加了 STATIC_ROOT

并添加了 os.system('python manage.py collectstatic --noinput')views.py 文件夹中用图像和视频填充静态路径,然后再将响应发送到 html 页面。

但我仍然收到 404,我还检查了同名文件在该位置是否可用。

我收到以下错误:

来自控制台的错误:能够加载 js,bootstrap 但能够加载图像和视频

我添加的来自 settings.py 的代码

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_DIR = os.path.abspath(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

DEBUG = False

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    "whitenoise.runserver_nostatic",
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ml_app.apps.MlAppConfig',
]

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

]

ROOT_URLCONF = 'project_settings.urls'

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

WSGI_APPLICATION = 'project_settings.wsgi.application'

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": os.path.join(PROJECT_DIR, 'db.sqlite3'),
    }
}

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'models')

STATICFILES_DIRS = [
        os.path.join(PROJECT_DIR, 'static'),
        os.path.join(PROJECT_DIR, 'models'),
    ]

STATIC_ROOT = os.path.join(PROJECT_DIR, 'staticfiles')

CONTENT_TYPES = ['video']
MAX_UPLOAD_SIZE = "104857600"

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'uploaded_videos')

编辑:

我将所有 uploaded_images 添加到 static/images/uploaded_images 中,这是加载静态图像,但现在的问题是它没有从 html 文件中的 for 循环加载图像

下面的图像按预期加载。

  <div id="preprocessed_images" class="col-12 mt-4 mb-2">
    {% for each_image in preprocessed_images %}
    <img src="{%static 'images/uploaded_images/uploaded_file_1651078566_cropped_faces_5.png'%}" class="preprocess"
      width=auto height="250" />

    {%endfor%}
  </div>

下面还是给404,每张图片的值是each_image = images/uploaded_images/uploaded_file_1651078566_cropped_faces_5.png

  <div id="preprocessed_images" class="col-12 mt-4 mb-2">
    {% for each_image in preprocessed_images %}

    <img src="{%static each_image%}" class="preprocess" width=auto height="250" />

    {%endfor%}
  </div>

我正在加载这样的媒体文件,但仍然是 404

<video height="320" width="640" id="predict-media" controls>
      <source src="{{MEDIA_URL}}{{original_video}}" type="video/mp4" codecs="avc1.4d002a" />
    </video>

我认为问题出在这里:

<div id="preprocessed_images" class="col-12 mt-4 mb-2">
{% for each_image in preprocessed_images %}

<img src="{% static each_image %}" class="preprocess" width=auto height="250" />

{%endfor%}

你不需要静态这个词,而是这样做:

<img src="{{ each_image.url }}" class="preprocess" width=auto height="250" />

Django 不会在生产环境中自动提供静态文件,我们需要像 apache/Nginx 这样的 Web 服务器来提供静态文件。

我能够通过将应用程序托管在 Nginx 作为反向代理服务器和 Gunicorn 来处理 Django 请求来提供静态文件。我使用 docker 来托管应用程序。

Blog

中给出了分步指南