解决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数据结构之二叉树的建立实例
Apr 29 Python
从零学Python之入门(三)序列
May 25 Python
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
Python实现文件复制删除
Apr 19 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
基于python实现蓝牙通信代码实例
Nov 19 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 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获取MSN好友列表类的实现代码
2013/06/23 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
php中this关键字用法分析
2016/12/07 PHP
PHP常用的三种设计模式
2017/02/17 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
python中的yield from语法快速学习
2020/11/06 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
经贸日语专业个人求职信范文
2013/12/28 职场文书
机关门卫岗位职责
2013/12/30 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
早会主持词
2014/03/17 职场文书
2014年计生标语
2014/06/23 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
2015年库房工作总结
2015/04/30 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
Java实现给Word文件添加文字水印
2022/02/15 Java/Android