解决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基本语法练习实例
Sep 19 Python
python爬虫实例详解
Jun 19 Python
python3将视频流保存为本地视频文件
Jun 20 Python
Python3爬虫学习入门教程
Dec 11 Python
Python设计模式之代理模式实例详解
Jan 19 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
解决pyshp UnicodeDecodeError的问题
Dec 06 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
Python post请求实现代码实例
Feb 28 Python
Python数据分析之pandas函数详解
Apr 21 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编程网上资源导航
2006/10/09 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
PHP的加密方式及原理
2012/06/14 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
超级退弹代码
2008/07/07 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python实现html转ubb代码(html2ubb)
2014/07/03 Python
在Django中限制已登录用户的访问的方法
2015/07/23 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Python如何在bool函数中取值
2020/09/21 Python
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
乡镇干部十八大感言
2014/02/17 职场文书
教师节简报
2015/07/20 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
你真的会用Mysql的explain吗
2022/03/31 MySQL