Django Debug 为false 时,静态资源的处理

原创
2013/10/14 06:32
阅读数 2.8W

setting.py   的 Debug 一直是True 的, 今天模拟上线操作,发现 当设置为 false 的时候,打开界面 首页那叫个一塌糊涂啊..

于是google 了下,找到了原因.

以下是google 的文章


原文链接:  老鱼的博客


从开始接接触python这门语言已有 四年了,中间陆续的学习,又不断的忘记,所以基本上是没有系统的知识体系。但是挺喜欢这门简洁,强大的动态语言。最近自己私人有个项目要做,虽然之前一直 是用java开发,但自己一个人做东西总想找点新鲜有激情的东西玩下,不用考虑团队知识的问题。所以毫不犹豫的选择用python。因为是个web项目, 所以框架就用django(python的web框架也蛮多,听说web.py很轻量级)。其实学习任何新的东西都是这样,光看书是没用的,一定要多动 手,多实践。好了,不扯了,回答这篇blog的重点上来。

  django对url和处理的具体代码的映射是在urls.py里配置的,如下:

urlpatterns = patterns('', url(r'^$', 'mysite.views.home', name='home'), url(r'^mysite/', include('mysite.foo.urls')), url(r'^admin/', include(admin.site.urls)), ) 

  这很好理解。但是静态文件(css,js)怎么处理呢?,静态文件是不需要做上面的映射的。

  在要在你的app工程下面新建一个"static"的文件夹,把静态资源放到些文件夹里(目录结构如下图),就可以通过http://localhost:8000/static/images/1.jpg访问了。

  

  但是现在有个问题:如果把settings.py配置改下:

?
DEBUG=False

  把DEBUG从True改成False后就会出现404(必需指定404和500错语页面,如上图的目录结构)找不到页面的错误。原因是DEBUG为 True时django会默认帮我们处理静态文件,而为False的话还需要我们做点事。在全局usrs.py中加下如下代码:

复制代码
from django.conf import settings if settings.DEBUG is False:
    urlpatterns += patterns('',
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', { 'document_root': settings.STATIC_ROOT,
        }),
   )
复制代码

修改settings.py中的设置:

STATIC_ROOT = 'F:/testweb/static'

以上设置是指定静态资源的绝对路径(根据你电脑的具体路径设置正确值),现在应该可以正确访问了。


总结:

  • 在DEBUG为true时我们只需要建立static目录后,把静态资源放进去就可以访问。在DEBUG为False时需要我们手动指定静态资源目录,并配置映射关系。
  • 在正式环境下建议不采用django处理静态资源文件,这样对应用服务器压力较大,也不好做cdn。可以用ngix,apache部署静态资源。





标题无“转载”即原创文章,版权所有。转载请注明来源:http://besteam.im/blogs/article/77/。

在水木的Python版问了一下,MEDIA_ROOT主要是用来放置上传的文件。Django的ORM有个特殊的字段叫做FileField是用来存储文件的。不过实际上并不会把文件内容存到数据库里面——因为大多数数据库保存文件时效率低,而是保存在文件系统里面。FileField只记录一个路径。FileField可以像个Python的file类型那样读写。

在开发的时候MEDIA_ROOT不应该存放任何文件。它应该指向一个空的目录。运行Django的开发服务器时,需要在urls.py里面加入一个MEDIA_URL的映射,才能正常显示上传的内容:

from django.conf import settings if 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将自动关闭。








展开阅读全文
打赏
1
10 收藏
分享
加载中
同意一楼,
个人觉得让web server 处理静态文件更好,包括它的缓存acl,控制起来会更方便。
2013/10/14 10:23
回复
举报
个人以为django这种做法有些多此一举。因为使用web server进行静态文件处理的话,这样静态链接直接被web server处理掉了,根本到不了django这里。所以要不要在应用层禁掉static的处理其实没关系。禁掉的唯一作用我觉得就是报个错让你知道罢了。
2013/10/14 09:35
回复
举报
更多评论
打赏
2 评论
10 收藏
1
分享
返回顶部
顶部