静态文件在 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注释掉就行了。
分享到:
相关推荐
1 配置单独app下的静态文件,比如某个app下的单独的图片。 2 配置整个project下的静态文件,适用于那些和单独app关联不大的文件,比如jquery bootstrap 等等 配置步骤: 首先,我们需要确认在settings.py文件中的...
3.将某个app要用的静态文件放置到my_app/static/my_app中,例如my_app/static/my_app/my_image.jpg. 当然也可以直接放在my_app/static中,但这样的话,如果在不同的app中有相同名字的静态文件,就会产生冲突。 4....
static下存放静态文件,templates下存放网页模板文件 2.修改setting.py 找到 STATIC_ROOT = … 在后面追加一行,然后保存 3.html引入js 4.前端验证 5.后台验证 您可能感兴趣的文章:django 解决自定义序列化...
主要介绍了解决django 多个APP时 static文件的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
static ,顾名思义就是静态文件,django自带了一个命令讲项目中所有的静态文件提取出来 python3 manage.py collectstatic 我习惯将这些可以从外部引入的文件放在项目的根目录下 DemoProject --DemoProject --Demo...
加载静态文件 在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片等。因此在 DTL 中加载静态文件是一个必须要解决的问题。在 DTL 中,使用 static 标签来加载静态文件。要使用...
当我们在一个项目下创建一个app后,我们就需要为该app下创建一个static 文件夹来存放相关静态资源。 但创建了多个app后,就需要在多个app下创建static。 这样引入了一个问题,因为,我们的可能用了同一个js文件。...
静态文件存放在 pms/app1/static Html文件存放在 pms/app1/template 验证码模块 md5加密模块 分页模块 bootstrap模块 form 模块在 pms/app1/utils Models 文件存放在 pms/app1/ Form上传的图片文件 存放在 pms/app1...
这样设置后一般来说我们只要把静态文件放在 APP 中的 static 目录下就可以,但是有时我们有一些共用的静态文件,这时候可以设置 STATICFILES_DIRS 另外弄一个文件夹。 2.STATIC_ROOT =os.path.join(BASE_DIR, '...
补充知识:Django-项目上线后,静态文件配置失效以及404、500页面的全局配置 一.项目上线后静态文件失效 1.因为项目还没上线的时候,django会默认从setting.py中这个设置 STATIC_URL = '/static/' STATICFILES_DIRS...
Python下有许多款不同的 Web 框架。...本章节给大家介绍Django中通过定时任务触发页面静态化的处理方式,具体内容如下所示: 安装 pip install django-crontab 添加应用 INSTALLED_APPS = [ ... 'djan
django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 django-staticfiles 的collectstatic 命令,在开发、部署环境下切换非常方便。 写 codinn.com 代码的时候,静态资源管理...
因此在DTL中加载静态文件是一个必须要解决的问题。在DTL中,使用static标签来加载静态文件。要使用static标签,首先需要{% load static %}。 加载静态文件的步骤如下: 首先确保django.contrib.staticfiles已经添加...
media/ 静态文件存放处,图片 movie/ Django的默认app,负责设置的配置还有url路由,部署等功能 static/ css文件和js文件的存放处 user/ 主app,程序的所有代码基本都在这下面 user/migrations为自动生成的数据库迁移...
django1.3新加入了一个静态资源管理的app,django.contrib.staticfiles。在以往的django版本中,静态资源的管理一向都是个问题。部分app发布的时候会带上静态资源文件,在部署的时候你必须手动从各个app中将这些静态...
燕尾面包店Wagtail Bakery 是一个使用 Django Bakery 进行静态生成的 SAMPLE 模块。使模型可用于静态生成向将静态生成的每个页面添加一个 bakery_views 属性为将静态生成的每个页面创建一个带有类的 bakery_views.py...
Python电影推荐系统+爬虫+可视化(协同过滤推荐算法)(包含项目源码+数据库文件+文档)计算机毕业设计 项目结构说明 |-- 项目 ... |-- static 静态文件夹 js css img这些文件 |-- templates 模板
javascript静态文件管理和加载 数据构建工具函数库 基于Django命令的CLI工具 安装 皮耶察特 请根据你的pyecharts版本安装django-echarts。 django-echarts暂未适配pyecharts v0.5.x,敬请期待。 詹加·埃查特斯 ...
静态文件托管在带有CloudFlare for CDN的Amazon S3上。 产品特点 产品展示 类别 大车 用户帐号 结帐(支持来宾结帐和已记录的用户帐户结帐) 命令 邮寄(订单确认) Cart App的REST API端点 静态文件(sass,...