解决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使用xlrd读取Excel格式文件的方法
Mar 10 Python
Python数据类型学习笔记
Jan 13 Python
python基于itchat实现微信群消息同步机器人
Feb 27 Python
Flask数据库迁移简单介绍
Oct 24 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
Python Pandas数据中对时间的操作
Jul 30 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
Django 路由层URLconf的实现
Dec 30 Python
python中编写函数并调用的知识点总结
Jan 13 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
PHP6 先修班 JSON实例代码
2008/08/23 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
在Python的Django框架中创建和使用模版
2015/07/15 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
手写一个python迭代器过程详解
2019/08/27 Python
详解Python self 参数
2019/08/30 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
Python中的全局变量如何理解
2020/06/04 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
护士自我鉴定总结
2014/03/24 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
劳模先进事迹材料
2014/12/24 职场文书
如何用python绘制雷达图
2021/04/24 Python
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
Python实现生活常识解答机器人
2021/06/28 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
日元符号 ¥
2022/02/17 杂记