解决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+selenium实现京东自动登录及秒杀功能
Nov 18 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
python得到单词模式的示例
Oct 15 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
Python子类继承父类构造函数详解
Feb 19 Python
详解django中url路由配置及渲染方式
Feb 25 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 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从数组中随机抽取一些元素的代码
2012/11/05 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
jquery 批量上传图片实现代码
2010/01/28 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
简介Python中用于处理字符串的center()方法
2015/05/18 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
python 代码运行时间获取方式详解
2020/09/18 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
物流专业大学应届生求职信
2013/11/03 职场文书
总经理的岗位职责
2014/02/23 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
结婚纪念日感言
2015/08/01 职场文书