Django 项目设置 Debug=False 后静态文件和上传文件404错误问题解决

Posted izbw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 项目设置 Debug=False 后静态文件和上传文件404错误问题解决相关的知识,希望对你有一定的参考价值。

注:该方法适用于 Django 项目、静态文件和上传文件在同一台设备中。如静态文件在专用服务器或使用CDN,请参考 https://docs.djangoproject.com/zh-hans/3.0/howto/static-files/deployment/

?静态文件和用户上传文件的相关配置本文不再赘述,直入主题吧。

?默认配置下,Django 会在 DEBUG=True 时通过 django.contrib.staticfiles app 自动发现静态文件,用户上传文件则需要下面代码去实现自动配置。

from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

?然而当 DEBUG=False 后再次访问项目时,会发现静态文件和用户上传文件(如用户头像)均报404错误。这是因为该方法对于 DEBUG=False 不适用。

?对于静态文件和用户上传文件的部署,Django 给了两种方案。

  1. 手动通过 django.views.static.serve() 为静态文件和用户上传文件配置提供服务。但这种方法不安全。
  2. 结合 Django 项目的部署 ,通过配置 Web 服务器(如:nginx),使其在 STATIC_URL 下为 STATIC_ROOT 目录下的文件提供静态文件服务,用户上传文件类似。官网推荐使用该方法。

环境

django = 2.2
python = 3.7

方案一:手动通过django.views.static.serve() 为静态文件和上传文件配置服务

  • settings.py 中配置静态文件和上传文件
# settings.py

DEBUG = False

# 静态文件
STATIC_URL = '/static/'
STATIC_ROOT=os.path.join(BASE_DIR,"/static/") # 使用collectstatic 后静态文件的存放绝对路径
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 存放静态文件的目录,其中也可以包含url

# 文件上传
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
  • project/project/urls.py 中为静态文件和上传文件配置URL
# urls.py

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

urlpatterns = [
    ...
    re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}, name='static'),
    re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media')
]
  • 收集静态文件,并将已发现静态文件复制到 settings.py
# 终端
python manage.py collectstatic
  • 启动服务,会发现静态文件和上传文件均显示成功
python manage.py runserver 0:8000

此后,若静态文件发生改变后再出现404错误,再次执行 python manage.py collectstatic 即可

方案二:通过配置 Web 服务器提供静态文件服务

更新中...

^O^

以上是关于Django 项目设置 Debug=False 后静态文件和上传文件404错误问题解决的主要内容,如果未能解决你的问题,请参考以下文章

Django 无法识别 DEBUG = False

在 Django Web 应用程序中设置 DEBUG=False 时出错

为啥当 Debug 设置为 False 时,Django 会为静态媒体生成 HTTP 500 错误?

为啥 DEBUG=False 设置使我的 django 静态文件访问失败?

Django 在 debug = False 时找不到我的媒体文件夹

使用 DEBUG 设置为 False 记录 Django SQL 查询