解决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 15 Python
python删除过期文件的方法
May 29 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
Python分支结构(switch)操作简介
Jan 17 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
Python内置函数property()如何使用
Sep 01 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 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代码(星期六,星期日总和)
2009/11/12 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
一个简单的php路由类
2016/05/29 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
python中快速进行多个字符替换的方法小结
2016/12/15 Python
python机器学习库常用汇总
2017/11/15 Python
Django模板Templates使用方法详解
2019/07/19 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
利用python生成照片墙的示例代码
2020/04/09 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
pycharm实现猜数游戏
2020/12/07 Python
人事专员岗位职责范本
2014/03/04 职场文书
超市中秋节促销方案
2014/03/21 职场文书
租房协议书怎么写
2014/04/10 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
身份证丢失证明
2015/06/19 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
python numpy中setdiff1d的用法说明
2021/04/22 Python
Python中的 Set 与 dict
2022/03/13 Python