4

我正在尝试优化我的网页,但无法在我的静态文件上设置过期日期标题。

我正在运行 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 文件。

任何帮助是极大的赞赏。谢谢!

4

3 回答 3

6

django staticfiles 应用程序不提供对自定义标头的开箱即用支持。您必须拼凑自己的视图来提供文件并将自定义标头添加到 HttpResponse。

但是您不应该使用 Django 提供静态文件。这是一个可怕的想法

  1. Django 是单线程的,并且是阻塞的。因此,每次您为用户提供静态文件时,您实际上并没有提供任何其他服务(包括您的应用程序代码,这就是 Django 的用途)。
  2. Django 的 staticviews 文件不安全且不稳定。该文档明确表示不要在生产中使用它。所以不要在生产中使用它。曾经。
于 2013-03-30T06:22:39.760 回答
1

在生产中,您不应该使用 Django 提供静态文件。请参阅此页面上的警告框:https ://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/#static-file-development-view

在开发中,Django 的应用程序通过覆盖命令contrib.staticfiles自动为您提供静态文件。runserver这样您就无法控制它为静态文件提供服务的方式。

--nostatic您可以通过将选项添加到 runserver 命令来阻止 staticfiles 应用程序提供静态文件:

./manage.py runserver --nostatic

Then you can write an url config to manually serve the static files with headers you want:

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)),
    )

If you want your manage.py to have the --nostatic option on by default, you can put this in your manage.py:

if '--nostatic' not in sys.argv:
    sys.argv.append('--nostatic')
于 2013-08-15T09:58:24.887 回答
0

我认为由于您将项目托管在 heroku 上,因此普遍接受的做法似乎是使用 S3 来提供静态文件。

看看这个问题: Proper way to handle static files and templates for Django on Heroku

我对此不太确定,但我相信您应该能够在从 S3 提供文件时更改标头,至少这个 SO 问题似乎暗示了这种方式 是否可以在不下载整个对象的情况下更改 S3 对象上的标头?

希望这可以帮助

于 2013-03-30T06:40:23.440 回答