解决 Django 生产环境无法加载静态文件问题

栏目: Python · 发布时间: 7年前

内容简介:线上部署时因设置了如果运行是通过但如果是通过

起步

线上部署时因设置了 settings.DEBUG = False 会导致静态文件都是 404 的情况。主要原因是应为关闭DEBUG模式后,Django 便不提供静态文件服务了。

runserver 的启动

如果运行是通过 runserver 命令的方式,那简单,在启动 runserver 指令后追加 --insecure 选项能参数强制 django 处理静态文件。

其他方式启动

但如果是通过 uwsgidaphne 等启动的话,追加选项的方式就不管用了。要解决这个问题,我们要手动去使用静态文件服务,这种处理方式是比较推荐的,因为它同时也支持了 runserver 的方式。

解决的方式如下,在 urls.py 中添加 url 规则:

from django.contrib.staticfiles.views import serve
from django.urls import re_path

def return_static(request, path, insecure=True, **kwargs):
    return serve(request, path, insecure, **kwargs)

urlpatterns = [
    ...
    re_path(r'^static/(?P<path>.*)$', return_static, name='static'), # 添加这行
]

这样就行了。

为什么这样就能解决了?

需要去做静态文件的路由匹配,但重点是这里多了个函数 return_static 去代理了 serve ,如果你稍微看下 serve 函数的代码就立马理解了:

def serve(request, path, insecure=False, **kwargs):
    if not settings.DEBUG and not insecure:
        raise Http404
    # code...

默认情况下 insecure=False ,并且在关闭调试模式后都是 404。通过写个 return_static 函数其实与 --insecure 的选项是异曲同工的。

媒体文件的处理

媒体文件的处理当然可以将上面 url 规则变动下就能加载了。如果用上面的方法来处理媒体文件可以得 90 分,那么下面的方法可以得 95 分。

上面的方法会搜索多个目录的,尽管开发人员会将静态文件同一放目录下。但 Django 的 admin 模块的静态文件存放在其他地方的。

而媒体文件,我们只会限定在一个目录的,所以更好的处理方法是只在一个目录下搜索:

from django.views.static import serve as static_serve   # 注意这里引入的与上面的不同
from django.urls import re_path

urlpatterns = [
    ...
    re_path(r'^media/(?P<path>.*)$' , static_serve, { 'document_root' : settings.MEDIA_ROOT}),
]

另外,如果网站的所有静态文件都只会在一个目录下(使用 collectstatic 能将所有静态文件都复制到一个目录),那么也请用这个 static_serve 方式去处理静态文件,我们希望我们的程序是精益求精的良品。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创投之巅——中国创投精彩案例

创投之巅——中国创投精彩案例

投资界网站 / 人民邮电出版社 / 2018-11 / 69.00

中国的科技产业发展,与创投行业密不可分。在过去的几十年间,资本与科技的结合,缔造了众多创业“神话”。回顾这些科技巨头背后的资本路径,可以给如今的国内创业者很多有益的启发。 本书从风险投资回报率、投资周期、利润水平、未来趋势等多个维度,筛选出了我国过去几十年中最具代表性的创业投资案例,对其投资过程和企业成长过程进行复盘和解读,使读者可以清晰地看到优秀创业公司的价值与卓越投资人的投资逻辑。一起来看看 《创投之巅——中国创投精彩案例》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具