解决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 numpy函数中的linspace创建等差数列详解
Oct 13 Python
Python随机函数random()使用方法小结
Apr 29 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
利用Django模版生成树状结构实例代码
May 19 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
python创建子类的方法分析
Nov 28 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
以SQLite和PySqlite为例来学习Python DB API
Feb 05 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 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弹出提示框的是实例写法
2019/09/26 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
node中实现删除目录的几种方法
2019/06/24 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
python抓取京东商城手机列表url实例代码
2013/12/18 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
Python如何使用函数做字典的值
2019/11/30 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
质检员的岗位职责
2013/11/15 职场文书
村党支部书记承诺书
2014/05/29 职场文书
领导参观欢迎词
2015/01/26 职场文书
如何写通讯稿
2015/07/22 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
协议书格式模板
2016/03/24 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
mysql创建存储过程及函数详解
2021/12/04 MySQL
SQL注入详解及防范方法
2021/12/06 MySQL