标题无“转载”即原创文章,版权全部。转载请注明来源:http://hgoldfish.com/blogs/article/77/。数据库
在水木的Python版问了一下,MEDIA_ROOT
主要是用来放置上传的文件。Django的ORM有个特殊的字段叫作FileField
是用来存储文件的。不过实际上并不会把文件内容存到数据库里面——由于大多数数据库保存文件时效率低,而是保存在文件系统里面。FileField
只记录一个路径。FileField
能够像个Python的file
类型那样读写。django
在开发的时候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文件了。app
更深层次的理解,这个东西实际上是用来方便布署Django App的。考虑一下咱们编写Django App的状况,常常会有一些静态的文件(JavaScript、图片等)。为了方便,把这些文件放置到App下面的static
目录里面。每一个App都有本身的子目录,因此在Django 1.3以前,布署的时候就麻烦了。有三种选择:url
一是使用django.views.static.serve
来处理文件。在App的urls.py
里面加上一条:code
url(r"^(?/static/P<path>.*)$", "django.views.static.serve",\ {"document_root" : "/path/to/project/app/static/"})
每一个App都要加入这条纪录,这样作的话,静态通过了Django的处理,速度太慢。blog
二是让用户手动写Apache的映射。将/static/
映射到/path/to/project/app/static
。这种方法更麻烦,不只URL不能冲突,并且破坏了App的代码独立原则。做为布署者,每一个App的状况都要至关熟悉,不能遗落(能够强制每一个App都使用static目录)。图片
三是由布署者将每一个App内的static
目录内的文件复制到一个指定的目录。而后重写Apache,将/static
映射到这个目录。这个方案能够说兼有第一方案与第二方案的优势,已经接近staticfiles
了。缺点是手动操做,仍是太麻烦了一点。ip
新的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/。