解决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通过floor函数舍弃小数位的方法
Mar 17 Python
python中defaultdict的用法详解
Jun 07 Python
Python中的单行、多行、中文注释方法
Jul 19 Python
python实现zabbix发送短信脚本
Sep 17 Python
Django 限制访问频率的思路详解
Dec 24 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
python实现简单俄罗斯方块
Mar 13 Python
python 追踪except信息方式
Apr 25 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
python IP地址转整数
Nov 20 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 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中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
php文件上传类完整实例
2016/05/14 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
CSS3 分类菜单效果
2019/05/27 HTML / CSS
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
在什么时候需要使用"常引用"
2015/12/31 面试题
美发店5.1活动方案
2014/01/24 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript
Golang 结构体数据集合
2022/04/22 Golang
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技