2014-02-13 70 views
0

我做了一個自動升級(Debian的規則,但有時踢...)的Django的,現在我不能讓我的應用程序的管理部分...Django的1.3-> 1.4.6 staticfiles

登錄(正確與否)後,調試顯示

ImproperlyConfigured at /admin/ 
You're using the staticfiles app without having set the required STATIC_URL setting. 
Request Method: POST 
Request URL: http://django.zzzz.yy:83/wwwwwwww/admin/ 
Django Version: 1.4.5 
Exception Type: ImproperlyConfigured 
Exception Value:  
You're using the staticfiles app without having set the required STATIC_URL setting. 
Exception Location: /usr/lib/python2.7/dist-packages/django/contrib/staticfiles/utils.py in check_settings, line 49 
Python Executable: /usr/bin/python 
Python Version: 2.7.3 
Python Path:  
['/home', 
'/home/wwwwwwww', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', 
'/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', 
'/usr/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages/PIL', 
'/usr/lib/pymodules/python2.7'] 

我讀了很多明智的教程,所以我知道,這個問題是這1.4是新的靜態文件,但我definetely不明白是什麼爲和(這對我來說更重要)如何修復它..

the settings.py:

(...)

# Absolute path to the directory that holds media. 
# Example: "/home/media/media.lawrence.com/" 
MEDIA_ROOT = '/home/media/' 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash if there is a path component (optional in other cases). 
# Examples: "http://media.lawrence.com", "http://example.com/media/" 
MEDIA_URL = '' 

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a 
# trailing slash. 
# Examples: "http://foo.com/media/", "/media/". 
ADMIN_MEDIA_PREFIX = '/static/' 

STATIC_ROOT = "/var/www/static/" 
STATIC_URL = "/static/" 

# List of callables that know how to import templates from various sources. 
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#  'django.template.loaders.eggs.Loader', 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    'django.contrib.admindocs', 
    'django.contrib.staticfiles', 
    'accounts', 
) 

(...)

和Apache設置:

Alias /admin_media/ /usr/share/pyshared/django/contrib/admin/media/ 

當我創造的應用程序(在1.3)我創建教程應用程序,不要添加任何CSS或圖像 - >只是純粹的應用程序 - 我使用管理員來編輯對象(這是非常早的版本 - 沒有界面 - 只是視圖)。

我的應用程序是在/ home:

/家庭/ APP1 /家庭/ APP 2 /家庭/ APP3

(這些應用程序是完全獨立的)

據我瞭解靜態文件對於Django的應用常見(如管理員的的CSS是一樣的所有的應用程序)

所以問題:

  1. 我應該在哪裏粘貼常用文件(以及它們現在的位置?
  2. 應該改變什麼設置?
  3. 我應該在哪裏粘貼CSS專門給各應用(在將來,當我出門很發展,並轉到 搶鮮; d
+0

是否使用1.4只是因爲這是版本Debian使用? – fcoelho

+0

是的。最高穩定性 –

+0

如果您沒有任何其他限制,請考慮在[virtualenv](http://www.virtualenv.org/en/ latestst /)中開發您的項目。你將能夠使用最新的Django版本,而不會修改你的系統範圍的版本 – fcoelho

回答

2

我不會單獨回答每一個問題,但會嘗試以覆蓋足夠的靜態文件,以便您可以正確使用它們。

您應該知道的第一件事是靜態文件應該是什麼樣的:CSS,Javascript,一些圖像,不會根據用戶交互;另一方面,媒體文件基本上是用戶上傳的文件,這些文件將會改變。

staticfiles應用程序可讓您更輕鬆地擁有靜態文件和多個位置,但以統一的方式使用它們,並且還可以在開發過程中輕鬆地使用它們。

在哪裏放置靜態文件

Django使用STATICFILES_FINDERS設置來確定如何找到您的靜態文件。默認情況下,啓用兩個查找器:FileSystemFinderAppDirectoriesFinder。第一個查找在STATICFILES_DIRS中指定的文件夾中的文件,並且非常簡單易用:將一個目錄添加到此設置中,將文件放入該文件並完成。

第二發現者AppDirectoriesFinder更有趣:對於INSTALLED_APPS中列出的任何應用程序,它將在每個應用程序內的名爲static的文件夾內查找靜態文件。所以,就你而言,它會尋找/home/app{1,2,3}/static中的靜態文件。

只要你以某種方式鏈接到你的靜態文件,你可以將你的靜態文件放在任何你想要的地方。如果您正在使用獨立應用程序,則需要使用static文件夾策略,因此您可以輕鬆地將您的應用程序和所有相關文件分發到一個包中,如admin所做的那樣。如果您正在開發專門針對您的項目的應用程序,則可以選擇其中一項或兩項。去找一個讓維護更容易,導致最少驚喜的嘗試(儘量避免「哦,我確定這個文件應該在這裏,但它在那裏」)。

如何通過移除ADMIN_MEDIA_PREFIX設置實際使用此

開始,它在1.4中過時,不再使用當前版本。

之後,你有你的靜態文件的地方,你可以寫,在模板:

{% load staticfiles %} 
... 
<link rel="stylesheet" href="{% static "some-css-file.css" %}"> 

{% static %}標籤將大致翻譯成{{STATIC_URL}}/some-css-file.css,它使用任何你定義爲在設置STATIC_URL

當您使用的是開發服務器(python manage.py runserver)服務中的文件

,Django會自動從隨時隨地爲您提供靜態文件。這很好,所有的,但它不會在Apache下工作,除非你明確告訴Django服務這些,即使當DEBUGFalse。但你可能shouldn't to this(閱讀「警告」)。

而應該使用名爲collectstatic的管理命令。當您運行此命令時,Django將通過INSTALLED_APPS中的每個應用程序以及STATICFILES_DIRS中的每個文件夾遍歷static文件夾,並將內容複製到STATIC_ROOT。之後,你只需要在Apache中添加一條規則,告訴它哪裏的文件。它應該是這樣的:

Alias STATIC_URL STATIC_ROOT 

或者,在你的設置文件中使用的值:

Alias /static/ /var/www/static/ 

摘要

現在我只回答了問題:

  1. 這取決於你。你可能想把它們放在一個單獨的文件夾中(你必須在STATICFILES_DIRS中指定)或者使用一個應用程序(一個叫做「網站」,「常用」或其他的東西,直到你),並將它們放在static文件夾中內;
  2. 從設置中,您似乎已經更改了需要的內容(您包括STATIC_URL)。請記住刪除ADMIN_MEDIA_PREFIX。當您使用collectstatic時,管理員靜態文件也會被複制;
  3. 把它們應用的static文件夾,並在生產中運行collectstatic將它們複製到一個地方的網絡服務器可以看到
+0

那麼,我可以使用兩個發現者嗎?/home/common表單常用文件和/ home/app {1,2,3}/static for static爲每個應用程序設計?以及如何設置apache Alias/static/- >/home/common? –

+0

是的,它的工作原理 - 我還沒有使用collectstatic,但更改設置會消除錯誤。 –

+0

你可以同時使用兩個,實際上這就是[默認啓用](https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/#staticfiles-finders)。無論如何,在提供文件之前,你仍然需要調用''collectstatic''。請注意,STATIC_ROOT不應該是STATICFILES_DIRS中的任何文件夾,因此如果您有一個「common」靜態文件文件夾(如'/ home/common'),則需要將STATIC_ROOT設置爲別的東西(比如''/ home/static'')。之後,使用Apache''Alias''來提供文件夾。檢查[本指南](http://bit.ly/1dYtkKS) – fcoelho

相關問題