解决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解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
Python中字符编码简介、方法及使用建议
Jan 08 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
python多线程同步实例教程
Aug 11 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
运行Python编写的程序方法实例
Oct 21 Python
python中用ggplot绘制画图实例讲解
Jan 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调用Oracle存储过程
2006/10/09 PHP
php的正则处理函数总结分析
2008/06/20 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
php提交post数组参数实例分析
2015/12/17 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
PHP中数组转换为SimpleXML教程
2019/01/27 PHP
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python 合并文件的具体实例
2013/08/08 Python
python连接mysql并提交mysql事务示例
2014/03/05 Python
python实现倒计时小工具
2019/07/29 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
如何利用python进行时间序列分析
2020/08/04 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python爬虫如何解决图片验证码
2021/02/14 Python
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
小学生考试获奖感言
2014/01/30 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
大足石刻导游词
2015/02/02 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
观后感的写法
2015/06/19 职场文书
公司备用金管理制度
2015/08/04 职场文书