2012-07-17 45 views
5

我在Heroku上運行Django。我可以成功運行collectstatic,但是當我到達站點時,顯然Django無法找到我的靜態文件。下面是我設置的片段 - 我認爲它主要是標準的東西:Heroku上的Django - 找不到靜態文件

STATIC_ROOT = '' 

# URL prefix for static files. 
# Example: "http://media.lawrence.com/static/" 
STATIC_URL = '/static/' 

PROJECT_DIR = os.path.abspath(os.path.dirname(__file__)) 


# Additional locations of static files 
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(PROJECT_DIR, 'static'), 
) 

# List of finder classes that know how to find static files in 
# various locations. 
if CLAYS_ENV == 'dev': 
    STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder', 
     'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
     'django.contrib.staticfiles.finders.DefaultStorageFinder', 
    ) 

而在我的情況下,CLAYS_ENV變量將被設置爲「開發」。關於爲什麼Django可以成功運行collectstatic,但之後無法找到文件的任何想法?

回答

3

完成的。建議在使用Heroku時通過CDN(如Amazon S3)提供靜態文件。雖然您仍然可以設法直接從Heroku提供服務,但參與動態請求的同一流程也會提供靜態數據,浪費處理時間。另外,對於媒體文件,由於Heroku的文件系統是「ephimeral」,所以必須使用CDN:每次部署新代碼時,Cedar堆棧的新映像將從頭開始重新創建,並且新的代碼簽出是製作。在部署之間創建的每個未被Git跟蹤的文件都將丟失。

+0

從文章本身出發:這對於大多數應用程序來說是完全足夠的,但是頂級應用程序可能想要使用帶有Django-Storages的CDN進行探索。 – 2013-09-18 05:33:31

4

收集靜態和靜態靜態媒體是兩回事。 Collectstatic只是將您的靜態媒體放入您的STATIC_DIRS

服務您的靜態文件是一個服務器進程,而不是collectstatic命令。我以前從未部署過heroku,但是你有一個url來將你的靜態資產映射到他們的位置?

if not settings.DEBUG: 
    urlpatterns += patterns('', 
     (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}), 
    ) 

您正在使用哪臺服務器?但是,通常你想讓服務器爲靜態媒體服務,而不是django。在apache中,這是通過設置Alias

+1

在較新版本的Django上,您可能需要稍微修改上面的「url」到url模式的前面 - 例如'url(r'^ static ...' – 2012-10-15 20:30:42

+0

這種方法不應該在生產環境中使用,而應該通過wsgi直接提供文件,您可以按照以下說明以這種方式提供服務:https:// devcenter .heroku.com/articles/django-assets – Josh 2013-09-18 01:07:52