2019独角兽企业重金招聘Python工程师标准>>>

转载自 limodou的学习记录

[Django]APP级别的静态文件处理

静态文件在 django 中并不是非常简单的事情。由于URL与文件目录并不是相同的东西,因此在处理 Django 中的静态文件时要同时考虑两个东西,一个就是静态文件的URL表示,另一个就是如果将静态文件的URL与实际的文件路径相对应起来。而在 Django 中标准的处理静态文件的方式是通过webserver,通过ReWrite规则,将一个URL的表示映射为实际的目录。因此这种做法要求我们将静态文件集 中管理,比如都放在某个media目录下,分为css, js, images等子目录,并且将整个项目所用到的所有静态文件都分别放在这个目录下。这样做的好处主要是为了方便映射。但同时造成一个问题:一个APP它应 该是相对自包含的,如有自已的Model,有自已的templates目录,有自已的templatetags目录。但唯独到了静态文件这块,由于这种集 中管理的要求无法分散到各自的目录下,使得管理起来变得麻烦和复杂。

那么为什么会这样?我思考了一段时间。有一个叫ToscaWidgets的项目,它说是可以将静态文件,如css,js与python代码一起打包 来使用,虽然我一直没有研究过它的代码,但是我猜想与web server的处理方式有关。比如它已经在TurboGears和Pylons中使用了,它们都支持真正的wsgi的方式,因此可以在底层解析时根据 url的不同进行静态文件的处理。而Django的哲学或者说是设计方式不同,它不使用真正的wsgi作为底层的机制,它使用自已的Middleware 来处理。当然,如果我们在Middleware来处理一样是可以的,但之所以Django不这样做是因为它认为:web server的机制应该会更出色,而django在这方面并不擅长,因此它并不建议由django来做。我想当网站处于生产状态这样是最合理的,但是当你 在开发时,这样并不方便,特别是对于重用性并不友好。因此在django中实现象其它的框架一样的分布式的静态资源的管理我认为很有必要。这样开发时可以 使用分布式,但在生产部署时采用集中式。

那么怎么做呢?首先我的想法是将静态文件分布到以APP为单位的单元中。可以有两种处理方式:一种方式是开发时继续使用django已经提供了的一 个供开发使用的静态文件服务的view模块,不过它不支持在APP中查找静态文件,因此我做了改造,当按原来的方式找不到静态文件时,就去遍历每个APP 下的固定目录。这样的话,这种方式是在urls.py中配置即可。同时APP下的固定目录可以在设置urls.py时指定。另一种方式则是做成一个 Middleware。前一种我已经实现,后一种没有实现,大同小异。

以openbookplatform中的具体实现为例,在urls.py中的配置为:

(r’^site_media/(.*)$’, ‘utils.staticview.serve’, {’document_root’: settings.SITE_MEDIA, ‘app_media_folder’:'media’}),

staticview.server是我改造后的方法。它除了需要一个与以前的方法一样的document_root参数外,还可以传入一个 app_media_folder的方法,这里为media,这样当以前的方式找不到静态文件时,会去每个已经安装的APP下的media目录下去查找相 匹配的文件。

然后在你需要放置静态文件的APP下,按照上面app_media_folder的设置创建相应的目录,如果需要子目录也一起创建。这样你也可以创建一个只有静态文件存在的APP。

当在生产运行时,只要再有一个简单的工具将所有APP下的静态目录拷贝到指定的目录下即可。这个工具我还没有开发,但是应该是很简单的。这样生产部署时只要运行这个工具即可。再修改下urls.py的配置将静态文件的处理pattern注释掉就行了。

转载于:https://my.oschina.net/memorybox/blog/74967

[Django]APP级别的静态文件处理相关推荐

  1. Django 无法加载静态文件(js,css,image)解决办法

    Django 无法加载静态文件(js,css,image)解决办法 按照这个配置成功: https://jingyan.baidu.com/article/8cdccae92ffc16315413cd ...

  2. 从零开始的Django框架入门到实战教程(内含实战实例) - 01 创建项目与app、加入静态文件、模板语法介绍(学习笔记)

    目录 1. 安装Django 2. 创建项目(startproject) 2.1 创建项目 2.2 介绍项目文件 2.3 APP(startapp) 3. 走通流程(urls, views, runs ...

  3. django debug=false后静态文件丢失_python框架Django实战商城项目之工程搭建

    项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...

  4. django里static配置静态文件的引入

    静态文件配置 简单地说就是:我们自己导入的一些包就叫做静态文件 配置的步骤: 1.在全局中先创建一个static的包, 2.在static里面导入我们的bootstrap,还是jquery等等... ...

  5. django:访问本地静态文件的配置

    1.在setting.py中新增如下配置,static为静态文件的目录,BASE_DIR为项目根目录 STATIC_URL = '/static/' STATIC_ROOT = os.path.joi ...

  6. 【django】配置前端静态文件【6】

    一.将静态⽂件存放⾄项⽬根⽬录下的static⽂件夹中 二.指定静态⽂件加载路径

  7. django html5 video,Django Web中的静态文件之HTML5第1篇

    自从小程序出来以后,H5更是火上加油,大热了一把.没错,小程序就是居于H5开发出来的.可惜咱们这次讲的不是小程序,而是讲HTML5,简称H5. H5中的5,是版本号来的,它在HTML4的基础上,进行了 ...

  8. 自学Python第二十二天- Django框架(三) AJAX、文件上传、POST 请求类型之间的转换、多APP开发、iframe、验证码、分页器、类视图、中间件、信号、日志、缓存、celery异步

    Django官方文档 django 使用 AJAX django 项目中也可以使用 ajax 技术 前端 前端和其他 web 框架一样,需要注意的是,django 接收 POST 请求时,需要 csr ...

  9. Django源码分析4:staticfiles静态文件处理中间件分析

    django源码分析 本文环境python3.5.2,django1.10.x系列1.在上一篇文章中已经分析过handler的处理过程,其中load_middleware就是将配置的中间件进行初始化, ...

最新文章

  1. 64位windows与32位windows的区别
  2. php 4443 端口_Server configuration (Notary)
  3. 使用SIFT特征提取和K-Means方法对图片进行分类
  4. Unity3D 游戏引擎之平面小球重力感应详解【转】
  5. 中国电信线CTF线下选拨writeup
  6. 【leetcodeMySQL每周一练】- 5道题带你练习mysql
  7. Mark Cuban投资组合中60%为BTC,30%为ETH
  8. ssm毕设项目疫情防控管理系统02vsf(java+VUE+Mybatis+Maven+Mysql+sprnig)
  9. Gitee更新代码提示:master has no tracked branch
  10. 源码角度了解Skywalking之Skywalking是如何进行JVM监控的
  11. IP地址的简明计算方法
  12. 手札 江湖的完美窗口化研究
  13. 黄哥python培训怎样
  14. ​前端VueRouter解析
  15. 数学建模系列-预测模型(一)灰色预测模型
  16. 卸载VMware时提示“The MSI failed”
  17. 数据库课程设计-图书馆管理系统(1.数据库分析部分)
  18. Yocto系列讲解[理论篇]31 - Linux kernel相关的任务
  19. 软件测试之网站测试如何进行?
  20. 中标候选人不再排序!“最低价中标”退场!招标人自主确定中标人!

热门文章

  1. linux pcie热插拔驱动_Linux安装TLP-高级电源管理工具
  2. 利用Python绘制萌萌哒的皮卡丘
  3. go kegg_3分钟了解GO/KEGG功能富集分析
  4. 教你如何防范远程桌面协议(RDP)的安全威胁
  5. 看下Linux 如何查看端口占用情况
  6. 人工智能改善客户服务体验
  7. AM335X的汇编语言与c语言,X86汇编语言学习手记 -- 汇编和C协同
  8. poj1422(最小路径覆盖问题)
  9. 第k大的数python代码_【Python】【输出前m大的数】
  10. CF1397B Power Sequence(大胆枚举)