解决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 29 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
Python并发:多线程与多进程的详解
Jan 24 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
python模块内置属性概念及实例
Feb 18 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
很让人受教的 提高php代码质量36计
2012/09/05 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
jquery简单体验
2007/01/10 Javascript
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
python黑魔法之参数传递
2016/02/12 Python
python中的json总结
2018/10/11 Python
python 处理string到hex脚本的方法
2018/10/26 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
Python 如何批量更新已安装的库
2020/05/26 Python
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
精通CAD能手自荐书
2014/01/31 职场文书
广告词串烧
2014/03/19 职场文书
选秀节目策划方案
2014/06/06 职场文书
人力资源职位说明书
2014/07/29 职场文书
2014年电教工作总结
2014/12/19 职场文书
优秀党支部申报材料
2014/12/24 职场文书
上下班时间调整通知
2015/04/23 职场文书
幸福终点站观后感
2015/06/04 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
图神经网络GNN算法
2022/05/11 Python