Django的MEDIA_ROOT和STATIC_ROOT--显示上传图片
2014-02-26 00:00
471 查看
标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/77/。
在水木的Python版问了一下,
在开发的时候MEDIA_ROOT不应该存放任何文件。它应该指向一个空的目录。运行Django的开发服务器时,需要在
当工程被布署到Apache时也要记得给
更深层次的理解,这个东西其实是用来方便布署Django App的。考虑一下我们编写Django App的情况,经常会有一些静态的文件(JavaScript、图片等)。为了方便,把这些文件放置到App下面的
一是使用
每个App都要加入这条纪录,这样做的话,静态经过了Django的处理,速度太慢。
二是让用户手动写Apache的映射。将
三是由布署者将每个App内的
新的Django提供了一个方法自动地将所有的静态文件放在一起。只要在写App的时候创建一个static子目录专门保存静态文件就行了。在开发阶段,不必费心去做映射,不需要配置
在开发阶段,Django把
标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/77/。
在水木的Python版问了一下,
MEDIA_ROOT主要是用来放置上传的文件。Django的ORM有个特殊的字段叫做
FileField是用来存储文件的。不过实际上并不会把文件内容存到数据库里面——因为大多数数据库保存文件时效率低,而是保存在文件系统里面。
FileField只记录一个路径。
FileField可以像个Python的
file类型那样读写。
在开发的时候MEDIA_ROOT不应该存放任何文件。它应该指向一个空的目录。运行Django的开发服务器时,需要在
urls.py里面加入一个MEDIA_URL的映射,才能正常显示上传的内容:
from django.conf import settingsif settings.DEBUG: urlpatterns += patterns(", url(r"^media/(?P<path>.*)$", \ "django.views.static.serve", \ {"document_root": settings.MEDIA_ROOT,}),)
当工程被布署到Apache时也要记得给
MEDIA_URL做个映射。
STATIC_ROOT是Django 1.3新增的特性。如同字面上的意思。保存在这个目录里面文件被当成静态文件处理。不过,千万不要把自己辛苦写的JavaScript、图片等静态文件放到里面去,接着看下去就知道了。与
STATIC_ROOT搭配使用的还有
STATIC_URL与
STATICFILES_DIRS两个变量。
STATIC_URL一般用默认的
/static/,用于指定的静态目录的URL。
STATICFILES_DIRS则指定一个工程里面哪个目录存放了与这个工程相关的静态文件,它是一个列表。假定在STATICFILES_DIRS有一个目录是"/dolphin/besteam/pages/static",其中有一个文件是
common.js。那么,在浏览器里面输入
http://localhost:8000/static/common.js就可以访问这个JavaScript文件了。
更深层次的理解,这个东西其实是用来方便布署Django App的。考虑一下我们编写Django App的情况,经常会有一些静态的文件(JavaScript、图片等)。为了方便,把这些文件放置到App下面的
static目录里面。每个App都有自己的子目录,所以在Django 1.3之前,布署的时候就麻烦了。有三种选择:
一是使用
django.views.static.serve来处理文件。在App的
urls.py里面加上一条:
url(r"^(?/static/P<path>.*)$", "django.views.static.serve",\ {"document_root" : "/path/to/project/app/static/"})
每个App都要加入这条纪录,这样做的话,静态经过了Django的处理,速度太慢。
二是让用户手动写Apache的映射。将
/static/映射到
/path/to/project/app/static。这种方法更麻烦,不仅URL不能冲突,而且破坏了App的代码独立原则。作为布署者,每个App的情况都要相当熟悉,不能遗落(可以强制每个App都使用static目录)。
三是由布署者将每个App内的
static目录内的文件复制到一个指定的目录。然后重写Apache,将
/static映射到这个目录。这个方案可以说兼有第一方案与第二方案的优点,已经接近
staticfiles了。缺点是手动操作,还是太麻烦了一点。
新的Django提供了一个方法自动地将所有的静态文件放在一起。只要在写App的时候创建一个static子目录专门保存静态文件就行了。在开发阶段,不必费心去做映射,不需要配置
urls.py。在布署到生产环境的时候,只需要配置Apache把
/static/映射到
STATIC_ROOT。然后运行
manage.py collectstatic,自动地
STATICFILES_DIRS列出的目录以及各个App下的static子目录的所有文件复制到STATIC_ROOT。因为复制过程可能会覆盖掉原来的文件,所以,一定不能把我们辛苦做出来静态文件放这边!
在开发阶段,Django把
/static映射到
django.contrib.staticfiles这个App。
staticfiles自动地从
STATICFILES_DIRS、
STATIC_ROOT以及各个App的
static子目录里面搜索静态文件。一旦布署到开发环境上,settings.py不需要重新编写,只要在Apache的配置文件里面写好映射,
/static将会被Apache处理。
django.contrib.staticfiles虽然仍然存在,但因为不会接收到以
/static/开始的路径,所以将不会产生作用。不必担心Django会使用处理速度变慢。另外,当
settings.DEBUG is False的时候,
staticfiles将自动关闭。
标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/77/。
相关文章推荐
- 苹果SSL_goto漏洞简介
- 很值得看看的中文翻译The Django Book
- modify firefox google search engine
- POJ 2762 Going from u to v or from v to u? Tarjan缩点+判断链
- DragonBones介绍
- GoLang反射的规则
- POJ 2632: Crashing Robots 哎呀!撞了!
- Ubuntu 安装任意版本Django
- ubuntu 如何卸载Django
- Django读取模板时报编码错误
- My Heart Will Go On(我心永恒)
- 七大经典排序-序
- django book2 表单学习笔记
- mgo map 处理源码阅读
- Django book2 模型 学习笔记
- Ubuntu系统下安装Google中文拼音输入法
- USACO 2.4 Fractions to Decimals (fracdec)
- USACO 2.4 Bessie Come Home (comehome)
- USACO 2.4 Cow Tours (cowtour)
- USACO 2.4 The Tamworth Two (ttwo)