2013-05-15 70 views
4

我試圖爲一個新的Django項目設置適當的STATIC_URL和STATIC_ROOT值,並且遇到了使用STATIC_URL的絕對URL的問題。在Django中使用STATIC_URL的相對vs絕對URL

我的項目的結構類似:

<project root> 
    static 
    media 
    src 
     <apps> 
     static 
      js 
      css 
       custom.css 
      i 
     settings.py 

在我的settings.py,我有

STATIC_ROOT = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../static/')) 

如果我設置STATIC_URL = '/static/',那麼我就可以完全訪問http://localhost:8000/static/css/custom.css

但是,如果我使用像STATIC_URL = 'http://localhost:8000/static/'這樣的絕對URL,就好像我在使用CDN一樣,那麼http://localhost:8000/static/css/custom.css將返回404錯誤。

不應該將這些設置有效地相同嗎?狀態STATIC_URL的docs可以是絕對的。爲什麼後面的設置無法加載靜態媒體?

回答

5

我剛剛測試過同樣的東西,使用http://localhost:8000/static/也不適用於我。

在我的設置中,我保留一個開發變量,因此在localhost中,url是'/ static /',當我部署時(我設置了DEVELOPMENT = False),它是一個完整的url。

if DEVELOPMENT == True: 
    STATIC_URL = '/static/' 
else: 
    STATIC_URL = 'https://www.mywebsite.com/static/' 
+3

這令人沮喪。 – Cerin

2

我假設你正在使用從django.conf.urls.staticstatic功能服務在開發環境中的靜態文件(這意味着DEBUG=True)。現在,您可以在文檔中閱讀該功能,但該功能不支持啓用DEBUG的絕對網址。

因此,從文檔:

https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files-during-development

「這個輔助功能僅在調試模式下,只有當給定的前綴是本地的(例如/靜態/),而不是一個URL(如http://static.example.com/)。 「

0

原因和解決方案很簡單,但根據我如何描述問題發現它是不直觀的。我沒有提到我的絕對STATIC_URL實際上有一個不同的域(http://localmedia:8000/static/而不是http://localhost:8000/static/)。

我這樣做是爲了簡化在我用來測試各種版本的IE的幾個外部開發Windows機器中的媒體託管的一部分。

但是,當STATIC_URLrunserver's本地域中的域不匹配時,Django只會提供來自STATIC_ROOT的內容,並且不會嘗試從應用程序文件夾中檢索媒體。不知道爲什麼,但這是事實。

如果我運行了manage.py collectstatic,它將通過將所有應用文件夾媒體複製到我的STATIC_ROOT來有效地修復404錯誤。或者,我可以在我的STATIC_URL中使用相同的域,Django會自動在應用程序文件夾中找到任何未收集的媒體。