2012-03-31 42 views
5

Django推薦我,如果我打算只使用一臺服務器(Apache)來同時提供動態和靜態文件,那麼I should serve static files using django.contrib.staticfiles如何在Django 1.4中使用django.contrib.staticfiles管理靜態文件(使用一臺Apache服務器)?

所以在我settings.py我已加載django.contrib.staticfilesINSTALLED_APPSdjango.core.context_processors.staticTEMPLATE_CONTEXT_PROCESSORS

我的,因爲它鏈接到靜態文件像這樣(從index.html)的管理模板注意:

{% load i18n admin_static %} 

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %} 

但看模板標籤admin_static,它只是爲static的包裝:

from django.conf import settings 
from django.template import Library 

register = Library() 

if 'django.contrib.staticfiles' in settings.INSTALLED_APPS: 
    from django.contrib.staticfiles.templatetags.staticfiles import static 
else: 
    from django.templatetags.static import static 

static = register.simple_tag(static) 

所以我得出結論,因爲每個管理靜態文件服務器的前綴爲admin/...,那麼完整路徑(對於我的情況)應該是

/usr/lib64/python2.7/site-packages/django/contrib/admin/static 

因此,我在settings.py的內部將該路徑設置爲我的STATICFILES_DIRS,但Apache仍然不會提供任何靜態文件(在重新聲明服務器之後)。我的邏輯在哪裏出錯?

回答

9

感謝丹尼爾·羅斯曼的解釋,並給了我學習對我自己的機會(現在我不會忘記的!):-)。

起初我真的很困惑,我不知道你不得不先收集靜態文件,然後告訴Apache 服務它。我認爲只需使用STATICFILES_DIRS,並在settings.py中包含static應用程序就夠用了。

因此,這裏是我如何做它(請讓我知道,如果我能做得更好):

settings.py

STATIC_ROOT = '/var/www/localhost/htdocs/mysite/static/' 
STATIC_URL = '/static/' # default 

它似乎Django中已經知道從哪裏收集管理文件,你不需要在STATICFILES_DIRS中指定任何東西,除非你需要提供你自己的定製文件(我沒有,因此我沒有使用Django的靜態文件的經驗)。

然後在​​類型python manage.py collectstatic -l-l意味着創建一個符號鏈接到所有找到的靜態文件,而不是複製它(節省一些空間)。

下一頁編輯Apache的配置文件(通常httpd.conf),並添加STATIC_URL信息。我的Django配置文件如下所示:

Alias /static/ /var/www/localhost/htdocs/mysite/static/ 
#In the form of... 
#Alias STATIC_URL STATIC_ROOT 

<Directory /var/www/localhost/htdocs/mysite/static> 
    Order deny,allow 
    Allow from all 
</Directory> 

WSGIScriptAlias//var/www/localhost/htdocs/mysite/mysite/wsgi.py 
WSGIPythonPath /var/www/localhost/htdocs/mysite 

<Directory /var/www/localhost/htdocs/mysite/mysite> 
    <Files wsgi.py> 
     Order deny,allow 
     Allow from all 
    </Files> 
</Directory> 

然後重新啓動Apache並完成!

+0

簡潔,深入而全面,謝謝) – 2015-04-23 17:58:20

3

您鏈接到的文檔根本沒有提及服務文件與靜態文件應用程序。這不是它的目的:它是爲了將靜態文件收集到一個地方,讓他們可以輕鬆地由Apache服務。 (它不應對發展服務的文件,但是這不是我們在這裏談論。)

你仍然需要設置Apache通過靜態/前綴爲來自相關位置的文件。

+0

我已經建立了Apache來使用'mod_wsgi'部署Django並使用包含在Django 1.4中的'wsgi.py'。我遵循[文檔建議](https://docs.djangoproject.com/en/1.4/howto/deployment/wsgi/modwsgi/)。 – hobbes3 2012-03-31 22:51:18

+0

那麼?你仍然需要設置它來爲你的靜態文件提供服務,正如該頁面下面的解釋。 – 2012-03-31 22:54:51

+0

然後我很困惑。我需要去'/ var/www/localhost/htdocs /'並創建一個到'/ usr/lib64/python2.7/site-packages/django/contrib/admin/static'的靜態符號鏈接。 ? – hobbes3 2012-03-31 23:06:46

相關問題