解决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和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
python基础教程之分支、循环简单用法
Jun 16 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
Jan 08 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
django-rest-framework解析请求参数过程详解
Jul 18 Python
学习Python需要哪些工具
Sep 04 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函数指定默认值方法的小例子
2013/12/04 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
详解Vue方法与事件
2017/03/09 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
vue中SPA单页面应用程序详解
2017/11/07 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python3实现单目标粒子群算法
2019/11/14 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
网络技术支持面试题
2013/04/22 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
优秀学生自我鉴定范例
2013/12/18 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
公司员工手册范本
2015/05/14 职场文书
公司开业主持词
2015/07/02 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
Python爬虫实战之爬取携程评论
2021/06/02 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS