解决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实现的一个火车票转让信息采集器
Jul 09 Python
Python中使用MELIAE分析程序内存占用实例
Feb 18 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
Python操作MongoDB详解及实例
May 18 Python
python遍历文件夹下所有excel文件
Jan 03 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
对numpy中向量式三目运算符详解
Oct 31 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
python中bytes和str类型的区别
Oct 21 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
python 判断文件或文件夹是否存在
Mar 18 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
PHP中的正规表达式(二)
2006/10/09 PHP
珊瑚虫IP库浅析
2007/02/15 PHP
php网页后退不再出现过期
2007/03/08 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
js实现股票实时刷新数据案例
2017/05/14 Javascript
react-redux中connect()方法详细解析
2017/05/27 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
Python变量访问权限控制详解
2019/06/29 Python
python中字符串的编码与解码详析
2020/12/03 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
结婚邀请函范文
2014/01/14 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
小学教师评语大全
2014/04/23 职场文书
村庄环境整治方案
2014/05/15 职场文书
篮球比赛口号
2014/06/10 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书