解决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数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
Python安装pycurl失败的解决方法
Oct 15 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
Pytorch之contiguous的用法
Dec 31 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
python动态规划算法实例详解
Nov 22 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中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
python 实现判断ip连通性的方法总结
2018/04/22 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
html5与css3小应用
2013/04/03 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
高级Java程序员面试要点
2013/08/02 面试题
教师实习期自我鉴定
2013/10/06 职场文书
历史专业毕业生的自我鉴定
2013/11/15 职场文书
优秀的计算机专业求职信范文
2013/12/27 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
管理失职检讨书
2015/05/05 职场文书
新员工辞职信范文
2015/05/12 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python