静态文件在 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文件中的...
static下存放静态文件,templates下存放网页模板文件 2.修改setting.py 找到 STATIC_ROOT = … 在后面追加一行,然后保存 3.html引入js 4.前端验证 5.后台验证 您可能感兴趣的文章:django 解决自定义序列化...
Django 项目中,如果有多个 APP,每个 APP 都有自己的 static 文件夹,那么如何设置静态文件的路径以避免混用?以下是解决方案: 1. 首先,在 settings 文件中修改配置路径,添加每个 APP 的 static 文件夹路径。 ...
3.将某个app要用的静态文件放置到my_app/static/my_app中,例如my_app/static/my_app/my_image.jpg. 当然也可以直接放在my_app/static中,但这样的话,如果在不同的app中有相同名字的静态文件,就会产生冲突。 4....
为了提供静态文件,我们需要配置Django的`STATIC_URL`和`STATICFILES_DIRS`设置,确保服务器知道如何找到并返回这些文件。 在这个例子中,访问`http://127.0.0.1:8000/static/iphone.png`显示图片,说明Django已经...
在Django框架中,处理静态文件是Web开发过程中的一个重要环节。静态文件通常包括CSS样式表、JavaScript脚本、图像和其他非动态内容,它们对于构建一个功能完备且美观的网页至关重要。本文将详细介绍如何在Django中...
在Django项目中,有效地管理和分离媒体文件...确保在生产环境中,根据需求调整静态文件和媒体文件的处理方式,例如,使用反向代理或CDN服务来提供静态和媒体文件。同时,保持模板结构清晰,有利于团队协作和项目维护。
加载静态文件 在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片等。因此在 DTL 中加载静态文件是一个必须要解决的问题。在 DTL 中,使用 static 标签来加载静态文件。要使用...
在`fileupload`应用中,我们需要创建一个视图来处理文件上传。在`views.py`中添加以下代码: ```python from django.http import JsonResponse from django.core.files.storage import default_storage def upload...
3. **Django与App Engine集成**:这涉及到将Django项目配置为在App Engine上运行,可能需要修改WSGI服务器、设置环境变量、处理静态文件和媒体文件的存储,以及解决两者之间的兼容性问题。 4. **App Engine SDK**:...
除了常规的静态文件之外,Django还提供了一种特殊类型的静态文件处理——用户上传文件(通常称为media文件)。这类文件通过模型字段`FileField`或`ImageField`上传至服务器。与静态文件不同,media文件需要通过`...
这个问题主要是由于Django的静态文件处理机制导致的。在深入探讨解决方案之前,我们需要先了解Django的静态文件管理和模板系统的基础知识。 **Django的静态文件管理** Django提供了方便的方式来管理和处理静态资源...
Django 还提供了丰富的功能,如用户认证系统、表单处理、中间件、缓存机制、静态文件处理等。学习如何利用这些功能来构建功能丰富的 Web 应用是 Django 入门的重要环节。 最后,为了深入学习 Python 和 Django,...
Django处理静态文件(如CSS、JavaScript)和媒体文件(用户上传的文件)的方式不同。静态文件在生产环境中通常由Web服务器直接提供,而媒体文件则需要通过Django的存储系统处理。 11. **测试**: Django提供了...
11. **部署与配置**:Django 应用可以通过 WSGI 服务器如 Gunicorn 或 uWSGI 部署在 Nginx 或 Apache 上,同时需要配置数据库连接、静态文件托管、电子邮件服务等。 通过深入学习和实践这个“Django 1.5 app”,你...
8. **静态文件与媒体文件**:静态文件(如 CSS、JavaScript 和图片)通常由 Django 的静态文件管理处理,而用户上传的文件(媒体文件)则需要配置单独的存储路径。 9. **测试**:Django 提供内置的测试框架,鼓励...