2013-03-30 71 views
3

我想優化我的網頁,並且在我的靜態文件上設置過期日期標頭時遇到問題。在Heroku上爲Django靜態文件添加過期標頭

我正在運行django-1.5,python-2.7.3。

這裏是我的緩存設置在settings.pyso遠:

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 
     'LOCATION': os.path.join(PROJECT_ROOT, 'cache/'), 
    } 
} 

CACHE_MIDDLEWARE_ALIAS = 'default' 
CACHE_MIDDLEWARE_SECONDS = 5 * 60 
CACHE_MIDDLEWARE_KEY_PREFIX = '' 

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware', 
    ... 
    'django.middleware.cache.FetchFromCacheMiddleware', 
) 

而且在settings.py我的靜態文件設置:

import os.path 

PROJECT_DIR = os.path.dirname(os.path.abspath(__file__)) 
PROJECT_ROOT = os.path.abspath(os.path.join(PROJECT_DIR, '..')) 

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles/') 

STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR, 'static'), 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

我發現的最接近的建議是here,但我無法修改Heroku上的.htaccess文件。

任何幫助,非常感謝。謝謝!

回答

5

django staticfiles應用程序不提供自定義標題的開箱即用支持。你必須一起破解你自己的視圖才能提供這些文件併爲HttpResponse添加自定義標題。

但你不應該使用Django來提供你的靜態文件。 這是一個可怕的想法

  1. Django是單線程和阻塞。所以每次你爲用戶提供一個靜態文件時,你都不需要其他任何東西(包括你的應用程序代碼,這正是Django的用處)。
  2. Django的staticviews文件不安全,並且不穩定。該文件明確表示不在生產中使用它。所以不要在生產中使用它。永遠。
+1

至於「一起砍你自己的觀點來提供文件和添加自定義頭到HttpResponse」,請參閱我的答案如何做到這一點。 – rednaw

1

在生產中,你不應該成爲Django的靜態文件。看到警告框此頁上:https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/#static-file-development-view

在開發,Django的contrib.staticfiles應用程序會自動通過覆蓋runserver命令爲您提供staticfiles。這樣你就無法控制它爲靜態文件提供服務的方式。

可以防止staticfiles應用,從通過添加--nostatic選項的runserver命令服務的靜態文件:

./manage.py runserver --nostatic 

然後,你可以寫一個URL配置手動服務與標題你想要的靜態文件:

from functools import wraps 
from django.conf import settings 
from django.contrib.staticfiles.views import serve as serve_static 
from django.conf.urls import patterns, url 

urlpatterns = patterns('',) 

if settings.DEBUG: 

    def custom_headers(view_func): 

     @wraps(view_func) 
     def wrapper(request, *args, **kwargs): 
      response = view_func(request, *args, **kwargs) 
      response['Custom-header'] = 'Awesome' 
      response['Another-header'] = 'Bad ass' 
      return response 

     return wrapper 

    urlpatterns += patterns('', 
     url(r'^static/(?P<path>.*)$', custom_headers(serve_static)), 
    ) 

如果你希望你的manage.py會對默認--nostatic選項,你可以把這個在您的manage.py

if '--nostatic' not in sys.argv: 
    sys.argv.append('--nostatic')