2010-01-14 91 views
13

背景:Django應用程序應如何捆綁靜態媒體?

我開始使用Django的第一次,這也是我第一次涉足網絡開發。我只是陷入了整個「服務靜態媒體」的問題。花了一段時間查看所有文檔和StackOverflow問題後,我想我理解它應該如何工作(即MEDIA_ROOT,MEDIA_URL,更新URL文件等)。

我的問題

好了,這裏是我不知道的部分。 Django應用程序應該是「可插入的」,即我可以將應用程序從一個項目移動到另一個項目。那麼,這些應用程序應該如何捆綁靜態媒體?

例如,假設我有一個「foo」應用程序,它具有加載一些css /圖像文件的模板。我應該在哪裏放置這些文件,以便在包含應用程序後自動獲得服務?

我看到的唯一解決方案是,安裝應用程序必須包括將其靜態媒體複製到服務於該媒體的服務器上的某個位置的額外步驟。

這是接受的方式嗎?它包括一個額外的步驟,但也許這是處理web-dev時的標準(我是新的,所以我不知道)。

另外,如果是這樣,是否有一個標準的方法來收集我所有的靜態媒體,以便知道我需要提供哪些服務? (也就是說,在應用程序中有一個名爲「media」或文件夾的標準文件夾?)。

感謝,

回答

9

公約是把靜態的媒體無論是媒體/應用程序的名字/或靜態/ APPNAME /應用(類似於模板)內。

對於在您的項目中使用媒體附帶的應用程序,我強烈建議使用django-staticfiles。它將通過替代django.views.static.serve的視圖自動爲媒體(包括應用內的媒體)提供開發服務,並且它提供了build_static管理命令,可將所有應用中的媒體複製到單個目錄中以便在生產環境中投放。

更新:django-staticfiles有become part of Django 1.3。它現在期望應用媒體生活在應用的「靜態/」子目錄中,而不是「媒體/」。而管理層的命令現在是「沉靜的」。

+0

從Django 1.3開始,這是現在正確的方法。 – 2012-04-07 08:20:02

+1

請注意,https://github.com/jaddison/django-cachebuster/爲Django 1.3提供了非常有用的{%static%}標記 – Eli 2012-07-30 15:27:55

2

我所知道的是,唯一的應用程序與此交易沒有任何干預是相當美好的django-debug-toolbar,雖然這是值得商榷的,這不是一個很好的例子,因爲它是一個應用程序專爲調試模式設計只要。

它與它交易的方式是,通過Django的服務於其媒體 - 看到源urls.py

url(r'^%s/m/(.*)$' % _PREFIX, 'debug_toolbar.views.debug_media'), 

總的來說,這是一個壞主意(你不想爲靜態通過Django的文件),每this comment from the documentation

[通過Django的服務靜態文件]是低效和 不安全。不要在 生產設置中使用此功能。僅在 開發中使用此項。

顯然,django-debug-toolbar只用於開發,所以我認爲它的部署方法很有意義,但這是一個例外。

一般來說,我知道這樣做的最佳方式是創建符號鏈接,無論媒體存儲在應用程序代碼中的媒體中。例如,在您的應用程序中創建一個名爲media的文件夾,然後要求安裝您應用程序的用戶從其媒體目錄添加符號鏈接,或者複製整個文件夾。

+0

我應該如何避免命名衝突/在我的代碼中引用它?如果我有一個帶媒體文件夾的「foo」應用程序和一個帶有媒體文件夾的「bar」應用程序,那麼如何在應用程序模板內引用該文件夾而不會導致問題? – 2010-01-14 14:19:33

+1

如果您的應用名爲foobar,請使用{{MEDIA_URL}} foobar/myawesomejs.js'查看您的媒體。要求你的用戶在他們的媒體目錄中設置'foobar'的符號鏈接。 – 2010-01-14 14:34:41

+0

我認爲我的答案如下(使用django-staticfiles)是一個更好的全面解決方案;特別是因爲它看起來像基於靜態文件的東西可能直接包含在Django 1.3中。 – 2010-06-21 21:01:16

2

我通常會把應用媒體放進去。/應用程序/應用程序的名字/靜態的(我的應用程序駐留在應用程序的子文件夾)

然後我有阿帕奇在虛擬主機類似的東西:

AliasMatch ^/apps/([^/]+)/static/(.*) /home/django/projectname/apps/$1/static/$2 
<DirectoryMatch "^/home/django/projectname/apps/([^/]+)/static/*"> 
     Order deny,allow 
     Options -Indexes 
     deny from all 
     Options +FollowSymLinks 
     <FilesMatch "\.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|txt|htm|html|json)$"> 
       allow from all 
     </FilesMatch> 
</DirectoryMatch> 

我也有這個在我的urls.py dev的服務器(只能使用調試):

def statics_wrapper(request, **dict): 
    from django.views import static 
    return static.serve(request, dict['path'], document_root = os.path.join(settings.BASE_DIR, 'apps', dict['app'], 'static'), show_indexes=True) 
urlpatterns += patterns('', (r'^apps/(?P<app>[^/]+)/static/(?P<path>.+)$', statics_wrapper)) 

這是非常方便的,因爲靜態URL只是映射到文件系統,如:

http://wwww.ecample.com/apps/calendar/static/js/calendar.js駐留在[BASE_DIR] /應用/ calend AR /靜態/ JS/calendar.js

希望這有助於

相關問題