2012-12-16 98 views
4

剛剛升級到Django 1.4,並且在開發服務器上靜態和媒體文件的「改進」服務方面遇到嚴重問題。我喜歡Django,但是爲什麼在STATIC_URL,STATIC_ROOT和STATICFILES_DIR這兩個文件更加複雜的情況下,現在完全超越了我。Django 1.4在開發服務器上提供MEDIA_URL和STATIC_URL文件

我只是試圖在開發服務器上提供靜態和上傳的所有文件。經過大量的實驗後,我有STATIC_URL文件的工作,但我根本無法獲得MEDIA_URL文件。

設置:

DIRNAME = os.path.dirname(__file__) 
MEDIA_ROOT = os.path.join(DIRNAME, 'media/') 
MEDIA_URL = '/media/' 
STATIC_ROOT = '' 
STATIC_URL = '/static/' 
STATICFILES_DIRS =() 

我已經得到了媒體和靜態上下文處理器補充說:

TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
'django.core.context_processors.media', 
'django.core.context_processors.static', 
"django.core.context_processors.request", 
'satchmo_store.shop.context_processors.settings', 
'django.contrib.messages.context_processors.messages', 

,我已經在url confs補充說:

# serve static and uploaded files in DEV 
urlpatterns += staticfiles_urlpatterns() 
urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

with t他在文檔中指出了兩個conf設置,第一個是靜態,第二個是媒體。

我的結構,網站作爲一個應用程序和靜態目錄放在裏面的djangoproject的指示:

<myproject> 
    --media 
    --settings 
    --templates 
    --website 
     |->static 

模板,我可以提供靜態內容沒有問題

{{STATIC_URL}}css/style.css 

但是,任何上傳的圖片,這一個使用photologue,沒有送達,但網址是正確的:

/media/photologue/photos/cache/spawning-2_admin_thumbnail.jpg 

該目錄結構確實退出媒體/

超級,超級困惑。這一切現在似乎都非常複雜,而我之前從未遇到任何問題。

+0

我知道這種感覺,我只是放棄了,並使用mod_wsgi和Apache來繞過Django的整個做法。 –

+0

我要補充我已經得到了應用安裝和調試=真正的staticfiles,因爲我可以提供靜態文件.. – professorDante

+0

它應該是'URL模式+ =靜態(...'不只是加? – Enrico

回答

2

我對Django很新,我從來沒有任何靜態內容的問題。

這是我的配置。我希望它可以幫助

我的文件夾結構

django-project 
--mainapp 
----settings.py 
----wsgi.py 
----[...] 
--otherapp 
--fixtures 
--static 
--templates 
--manage.py 
--requirements.txt 

settings.py

import os, socket 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 
MAIN_APP = os.path.abspath(os.path.dirname(__file__)) 
PROJECT_ROOT = os.path.abspath(os.path.join(MAIN_APP, "..")) 
MY_LOCALHOST = "VirusVault.local" # this is the real name of my local machine :) 

try: HOST_NAME = socket.gethostname() 
except: HOST_NAME = "localhost" 

[...]

if HOST_NAME == MY_LOCALHOST: 
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static/') 
    STATIC_URL = "/static/" 
    MEDIA_ROOT = os.path.join(STATIC_ROOT, 'media/') 
    MEDIA_URL = "/media/" 
else: 
    STATIC_ROOT = "/server/path/to/static/files" 
    STATIC_URL = "http://server.com/static/" 
    MEDIA_ROOT = "/server/path/to/static/files/media/" 
    MEDIA_URL = 'http://server.com/static/media/' 

您需要添加'django.contrib.staticfiles'到INSTALLED_AP PS

urls。PY

if settings.HOST_NAME == settings.MY_LOCALHOST: 
    urlpatterns += patterns('', 
     (r'^media/(?P<path>.*)$', 'django.views.static.serve', 
     {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), 
    ) 
    urlpatterns += patterns('', 
     (r'^static/(?P<path>.*)$', 'django.views.static.serve', 
     {'document_root': settings.STATIC_ROOT, 'show_indexes': True}), 
    ) 
+0

我忘了說這個配置對我在Webfaction的生產服務器是有效的。這就是爲什麼我將「if」包含在內的原因,所以我只需要一個用於開發和生產環境的設置文件 – xleon

+0

我認爲,使用Django的服務器在生產服務器上提供靜態文件是一個糟糕的選擇。它僅用於開發目的。在Apache或Nginx上最好使用mod_wsgi,並在其上提供靜態文件。你也不需要絕對的URL定義。 – username

+0

Hi @username。我不使用django服務器進行生產。這個配置在apache(mod_wsgi)和nginx中用於靜態文件。超出/ static /的所有內容都由nginx處理。絕對網址只是爲了清晰起見 – xleon

0

我打算先寫評論,但不知何故add comment按鈕不起作用。

您是否檢查媒體目錄的權限?

,因爲它成爲一個答案,我會傾我的工作完美的Django 1.4站點配置之一。

結構:

-myproject 
-- media 
-- static 
-- templates 
-- myproject 
--- settings.py 
--- urls.py 

settings.py:

PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__)) # Not the best way but works 
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media/') 
MEDIA_URL = '/media/' 
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static/') 
STATIC_URL = '/static/' 

urls.py:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
urlpatterns = patterns('', 
... 
(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
    {'document_root': settings.MEDIA_ROOT}), 
) 
urlpatterns += staticfiles_urlpatterns() 
+0

這是如何工作的 - 你沒有一個url conf設置來提供'/ media'下的文件?服務器如何知道如何處理這些文件? – professorDante

+0

對不起。我忘了。 – username

+0

@ user1907157它歸結爲使用PROJECT_ROOT而不是DIRNAME設置MEDIA_ROOT的用戶名。 Settings.py現在位於項目根目錄的子文件夾中,並且媒體根目錄需要相應更新。看到我的答案。 – Enrico

0

如果您正在使用Django 1.4文件夾結構,您已經轉移到settings.py您的新website應用文件夾,這意味着您的MEDIA_ROOT現在不正確。不知道相對位置在這種情況下工作,但它應該是這樣的

MEDIA_ROOT = os.path.join(DIRNAME, '../media/') 

這可能是簡單的使用絕對路徑。

+0

不,沒有將settings.py移動到網站應用程序中 - 它在應用程序中,由startproject命令設置。它應該在網站應用程序? – professorDante

+0

它應該在myproject/myproject中;這就是Django 1.4在新項目中的地位。我以爲網站是你的「myproject」應用程序,我的歉意。答案仍然成立。使用絕對路徑工作嗎? – Enrico

+0

我相信你在正確的路線@Enrico。儘管目前使用絕對路徑並不起作用。 – professorDante

相關問題