Djang中靜態(tài)文件配置方法
下面通過圖文并茂的方法給大家詳細(xì)介紹下Djang中靜態(tài)文件配置方法
一、django靜態(tài)文件配置原理
靜態(tài)文件配置就是為了讓用戶請(qǐng)求時(shí)django服務(wù)器能找到靜態(tài)文件返回。
首先要理解幾個(gè)概念:
媒體文件:用戶上傳的文件
靜態(tài)文件:css,js,image等
開發(fā)環(huán)境:使用django內(nèi)置服務(wù)器處理靜態(tài)文件
生產(chǎn)環(huán)境:使用apache2/nginx服務(wù)器處理靜態(tài)文件映射
所以在配置時(shí)要分清楚開發(fā)環(huán)境還是生產(chǎn)環(huán)境,這個(gè)后面會(huì)詳細(xì)介紹。
下面先介紹一下服務(wù)器查找靜態(tài)文件的原理,這樣我們才能更好的配置。
1、django.contrib.staticfiles
django.contrib.staticfiles是django1.3新增的一個(gè)app來幫助開發(fā)者管理靜態(tài)文件【js,css等】。
django1.3之前的靜態(tài)文件都是用MEDIA_URL和MEDIA_ROOT來控制的。
為了將媒體文件【用戶上傳的文件】和靜態(tài)文件做區(qū)分,django1.3通過MEDIA_XXX配置來處理媒體文件,通過STATIC_XXX配置項(xiàng)來處理靜態(tài)文件。
staticfiles使開發(fā)者可以將靜態(tài)文件分配到app目錄或任意指定目錄。
2、MEDIA_XXX和STATIC_XXX配置項(xiàng)的區(qū)別
MEDIA_XXX配置項(xiàng)用來管理媒體文件。經(jīng)常由FileFields字段上傳,它們被保存在settings.MEDIA_ROOT指定的目錄下,通過settings.MEDIA_URL指定的路徑訪問。
STATIC_XXX配置項(xiàng)用來管理靜態(tài)文件。它們通過manage.py collectstatic命令匯集到settings.STATIC_ROOT目錄,并通過settings.STATIC_URL指定的路徑訪問。
3、 靜態(tài)文件相關(guān)配置項(xiàng)詳解
STATIC_ROOT配置項(xiàng)
用來指定執(zhí)行manage.py collectstatic時(shí)靜態(tài)文件存放的路徑。在生成環(huán)境中,集中存放靜態(tài)資源有利于使用Lighttpd/Nginx/apache2托管靜態(tài)資源。為了方便調(diào)試,通常設(shè)置如下:
SITE_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.join(SITE_ROOT, '../'))
STATIC_ROOT = os.path.join(SITE_ROOT, 'collectedstatic')
STATIC_URL配置項(xiàng)
django模板中,可以引用{{STATIC_URL}}變量避免把路徑寫死。通常使用默認(rèn)設(shè)置
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX配置項(xiàng)
ADMIN_MEDIA_PREFIX必須為如下配置,以便staticfiles能夠正確找到django.contrib.admin的靜態(tài)資源:
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
在模板中使用STATIC_URL
<link rel="stylesheet" href="{{ STATIC_URL }}css/core.css">
原理懂了后,接下來介紹開發(fā)環(huán)境和生產(chǎn)環(huán)境中靜態(tài)文件具體配置。
我的django版本是1.4.21,以此版本做介紹。
>>> import django
>>> print django.get_version()
1.4.21
二、開發(fā)環(huán)境
django1.4,21中默認(rèn)已安裝了staticfiles app,所以開發(fā)環(huán)境中對(duì)靜態(tài)文件的訪問不需要對(duì)django做任何配置。
有一點(diǎn):開發(fā)環(huán)境staticfiles查找靜態(tài)文件的順序取決于STATIC_FINDERS配置項(xiàng),默認(rèn)配置
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
FileStstemFinder用來用STATICFILES_DIRS【默認(rèn)為空】指定的路徑中查找額外的靜態(tài)文件。像jquery,bootstrap等這樣公用的資源文件都是在多個(gè)不同的app中共用的,django提供了公有的目錄來放這些文件,這個(gè)配置參數(shù)就是:STATICFILES_DIRS
AppDirectoriesFinder從INSTALLED_APPS元組中的APP所在包的static目錄中查找資源文件。
使用如下。
1、新建項(xiàng)目lxyproject
[root@yl-web srv]# django-admin.py startproject lxyproject
2、在項(xiàng)目中新建一個(gè)app名叫hello
[root@yl-web lxyproject]# python manage.py startapp hello
[root@yl-web lxyproject]# ls
hello lxyproject manage.py
在hello app下建一個(gè)static目錄用來存放靜態(tài)文件。
[root@yl-web hello]# mkdir static
[root@yl-web hello]# ls
__init__.py models.py static tests.py views.py
然后在static目錄新建一個(gè)hello.txt的靜態(tài)文件。
[root@yl-web hello]# cd static/
[root@yl-web static]# ls
hello.txt
[root@yl-web static]# cat hello.txt
hello.txt's content:congratulations!!
3、在項(xiàng)目的settings.py文件中INSTALLED_APPS中配置hello app
INSTALLED_APPS = (
...
'hello',
)
4、運(yùn)行項(xiàng)目
[root@yl-web lxyproject]# python manage.py runserver 0.0.0.0:9000
5、通過url訪問
在static目錄下新建一個(gè)images目錄放一張sheep.png圖片,同理通過url訪問
三、生產(chǎn)環(huán)境
前面也說了,在生成環(huán)境中,集中存放靜態(tài)資源有利于使用Lighttpd/Nginx托管靜態(tài)資源。而生產(chǎn)環(huán)境一般是把靜態(tài)文件放在項(xiàng)目根目錄下的static目錄下。
默認(rèn)配置
STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (
)
我們要做的是
1、配置服務(wù)器,我用的是apache。
安裝配置詳情可參考:
Ubuntu apache2服務(wù)器配置
centos7 apache httpd安裝和配置django項(xiàng)目
2、在項(xiàng)目根目錄下創(chuàng)建collectedstatic目錄。
3、配置settings.py
import os SITE_ROOT = os.path.dirname(os.path.abspath(__file__)) SITE_ROOT = os.path.abspath(os.path.join(SITE_ROOT, '../')) STATIC_ROOT = os.path.join(SITE_ROOT, 'collectedstatic') STATIC_URL = '/static/' STATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'hello', )
4、運(yùn)行python manage.py collectstatic收集所有已安裝的APP的靜態(tài)文件到根目錄的collectedstatic【即STATIC_ROOT】中
[root@yl-web lxyproject]# python manage.py collectstatic
You have requested to collect static files at the destination
location as specified in your settings.
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: yes
Copying '/srv/lxyproject/hello/static/images/sheep.png'
1 static file copied.
5、配置服務(wù)器,將/static/路徑指向STATIC_ROOT目錄。
即在虛擬主機(jī)中配置
Alias /static/ /srv/lxyproject/collectedstatic/
6、配置至此完成,通過瀏覽器訪問
真正發(fā)布一個(gè)django項(xiàng)目時(shí),對(duì)靜態(tài)文件的管理可能需要額外做一些工作:
Less / CoffeeScript 等自動(dòng)編譯成css/js
"壓縮" css/js文件,提高瀏覽器加載速度
合并零碎的css/js文件,減少瀏覽器請(qǐng)求次數(shù)
靜態(tài)資源文件的版本話:瀏覽器會(huì)緩存靜態(tài)文件,后臺(tái)代碼和靜態(tài)資源文件都發(fā)生更新后,瀏覽器很可能從緩存提取過期的靜態(tài)資源,導(dǎo)致頁面顯示異常。
以上就是Djang中靜態(tài)文件配置方法的全部?jī)?nèi)容,希望大家喜歡。
相關(guān)文章
Python3下錯(cuò)誤AttributeError: ‘dict’ object has no attribute’ite
這篇文章主要跟大家介紹了關(guān)于在Python3下錯(cuò)誤AttributeError: 'dict' object has no attribute 'iteritems'的分析與解決方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-07-07使用Python編寫一個(gè)在Linux下實(shí)現(xiàn)截圖分享的腳本的教程
這篇文章主要介紹了使用Python編寫一個(gè)在Linux下實(shí)現(xiàn)截圖分享的腳本的教程,利用到了scrot和urllib2庫,需要的朋友可以參考下2015-04-04Python教程通過公共鍵對(duì)不同字典進(jìn)行排序示例詳解
本篇文章是Python教程基礎(chǔ)篇,通過一些示例為大家講解Python通過公共鍵對(duì)不同字典進(jìn)行排序的方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09Python基于Logistic回歸建模計(jì)算某銀行在降低貸款拖欠率的數(shù)據(jù)示例
這篇文章主要介紹了Python基于Logistic回歸建模計(jì)算某銀行在降低貸款拖欠率的數(shù)據(jù),結(jié)合實(shí)例形式分析了Python基于邏輯回歸模型的數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2019-01-01Python詞云的正確實(shí)現(xiàn)方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Python詞云的正確實(shí)現(xiàn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05使用Python編寫Linux系統(tǒng)守護(hù)進(jìn)程實(shí)例
這篇文章主要介紹了使用Python編寫Linux系統(tǒng)守護(hù)進(jìn)程實(shí)例,本文先是講解了什么是守護(hù)進(jìn)程,然后給出了一個(gè)Python語言的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2015-02-02從零學(xué)Python之入門(五)縮進(jìn)和選擇
空白在Python中是重要的。事實(shí)上行首的空白是重要的。它稱為縮進(jìn)。在邏輯行首的空白(空格和制表符)用來決定邏輯行的縮進(jìn)層次,從而用來決定語句的分組。2014-05-05