赞
踩
django静态文件的安放位置有两种:
1.每个app里面的static文件夹。在加载静态文件时,比如要在模板中用到静态文件,django默认会自动在每个app里面搜索static文件 夹。
2.另一种,就是在所有的app件外面,建立一个公共的文件夹如common_static。
那现在的问题是如何让django知道你把一些静态文件放到app以外的公共文件夹中呢,
那就需要配置STATICFILES_DIRS=[os.path.join(BASE_DIR, 'static')]
STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找(注意,django查找静态文件是惰性查找,查找到第一个,就停止查找了)
django在生产环境下会关闭对外提供静态文件的功能,那么如何经静态文件返回给浏览器呢,这就是STATIC_ROOT的功能。
例如STATIC_ROOT=os.path.join(BASE_DIR, 'static_collections')
执行 python managy.py collectstatic
django会收集app下的静态文件、admin静态文件、STATICFILES_DIRS静态文件、及其他第三发库中包含的静态文件到这个目录下。之后再用nginx指向该路径,将静态文件代理出去。或者配置url.py:
urlpatterns = [
...
url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}), # 生产环境下对外提供静态文件的url
]
那么到此为止,静态文件的机制就可以运作了,但是,你通过浏览器访问静态文件时,不可能直接通过http://127.0.0.1:8000/home/myproject/common_static/images/1.png 这样的地址访问吧,结果会直接报错。
那么django是如何让浏览器也可以访问服务器上的静态文件呢,前面已经说了,直接访问服务器本地的地址是不行的,那就需要一个映射,django利用STATIC_URL来让浏览器可以直接访问静态文件,比如:
STATIC_URL = '/static/'
那么可以在浏览器上输入:
http://127.0.0.1:8000/static/images/1.png
那么就相当与访问:
/home/myproject/common_static/images/1.png
MEDIA_ROOT:
MEDIA_ROOT主要是用来放置用户上传的文件。Django的ORM有个特殊的字段叫做FileField
是用来存储文件的。不过实际上并不会把文件内容存到数据库里面,而是保存在MEDIA_ROOT文件夹下,FileField
只记录一个路径。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。