生产模式下 Django 中静态图像和媒体的 404
404 for static images and media in Django in Production Mode
我是 Django 初学者
我正在尝试 运行 我的应用程序在 Debug=False
模式下模拟生产环境,我已经添加了所有静态 url 和根目录。我的程序在 运行 时间内根据传递给应用程序的视频实时生成静态图像。
这在开发模式下按预期工作,但我在生产模式下的图像和视频得到 404,其他东西如 bootstrap 和 JS 正在加载正常。
早些时候 bootstrap 并且 js 也没有加载然后我安装了 Whitenose 并且一切开始工作,但现在图像和视频并给出 404。
除此应用程序外,我还在 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
中给出了分步指南
我是 Django 初学者
我正在尝试 运行 我的应用程序在 Debug=False
模式下模拟生产环境,我已经添加了所有静态 url 和根目录。我的程序在 运行 时间内根据传递给应用程序的视频实时生成静态图像。
这在开发模式下按预期工作,但我在生产模式下的图像和视频得到 404,其他东西如 bootstrap 和 JS 正在加载正常。
早些时候 bootstrap 并且 js 也没有加载然后我安装了 Whitenose 并且一切开始工作,但现在图像和视频并给出 404。
除此应用程序外,我还在 settings.py
中添加了STATIC_ROOT
并添加了 os.system('python manage.py collectstatic --noinput')
在 views.py
文件夹中用图像和视频填充静态路径,然后再将响应发送到 html 页面。
但我仍然收到 404,我还检查了同名文件在该位置是否可用。
我收到以下错误:
我添加的来自 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
中给出了分步指南