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


Posted in Python onApril 23, 2019

起步

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

runserver 的启动

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

其他方式启动

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

默认情况下 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 方式去处理静态文件,我们希望我们的程序是精益求精的良品。

总结

另外还有通过第三方程序来处理静态文件,比如 nginx 设置 alias 等。但显然我更希望是程序自身的处理方式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中map、any、all函数用法分析
Apr 21 Python
python 显示数组全部元素的方法
Apr 19 Python
python tornado微信开发入门代码
Aug 24 Python
python实现梯度下降算法
Mar 24 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
详解python校验SQL脚本命名规则
Mar 22 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
Python可以实现栈的结构吗
May 27 Python
Django多数据库联用实现方法解析
Nov 12 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
Python 存储字符串时节省空间的方法
Apr 23 #Python
Django页面数据的缓存与使用的具体方法
Apr 23 #Python
Python切片操作去除字符串首尾的空格
Apr 22 #Python
详解python中的hashlib模块的使用
Apr 22 #Python
Python 中包/模块的 `import` 操作代码
Apr 22 #Python
python定时检测无响应进程并重启的实例代码
Apr 22 #Python
django query模块
Apr 20 #Python
You might like
一些花式咖啡的配方
2021/03/03 冲泡冲煮
检查php文件中是否含有bom的函数
2012/05/31 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
生产总经理岗位职责
2013/12/19 职场文书
毕业设计计划书
2014/01/09 职场文书
先进集体事迹材料
2014/02/17 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
裁员通知
2015/04/25 职场文书
初中数学教学随笔
2015/08/15 职场文书
教师远程培训心得体会
2016/01/09 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript