解决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解析XML的几种方式
Feb 16 Python
python编写弹球游戏的实现代码
Mar 12 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
python opencv 图像拼接的实现方法
Jun 27 Python
实例详解Python装饰器与闭包
Jul 29 Python
Django如何实现上传图片功能
Aug 16 Python
Tensorflow限制CPU个数实例
Feb 06 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
Python如何转换字符串大小写
Jun 04 Python
Python检测端口IP字符串是否合法
Jun 05 Python
pytorch 实现变分自动编码器的操作
May 24 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 问卷调查结果统计
2015/10/08 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
python字符串string的内置方法实例详解
2018/05/14 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
Python根据成绩分析系统浅析
2019/02/11 Python
Django 用户认证组件使用详解
2019/07/23 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
介绍一下UNIX启动过程
2013/11/14 面试题
团员个人的自我评价
2013/12/02 职场文书
关于安全的演讲稿
2014/05/09 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
打架检讨书范文
2015/01/27 职场文书
主持人大赛开场白
2015/05/29 职场文书