【问题标题】:Cache-Control not being set in response header响应标头中未设置缓存控制
【发布时间】:2017-09-08 01:51:21
【问题描述】:

我正在尝试通过利用浏览器缓存来优化我的 Django Web 应用程序。我在我的主视图函数返回的响应中设置了一个等于一年的 max-age 的 Cache-Control 标头。但是,当我加载我的网站并检查主页上某些图像的响应标头时,缓存控制标头不存在。我尝试了两种不同的方法来设置响应头。首先,我尝试使用 Django 内置的缓存控制装饰器。我还尝试简单地获取呈现的响应,并在其返回语句之前在我的视图函数中设置标题。静态图片的缓存方式不同吗?

查看功能

def view_home(request, page=None):
    # FIND THE HOME PAGE IF WE DO NOT HAVE ONE
    # IF NOT FOUND RETURN 404
    if not page:
        try:
            page = WebPage.objects.get(template='home')

        except WebPage.DoesNotExist:
            raise Http404

    try:
        billboards = Billboard.get_published_objects()

    except Exception as e:
        logging.error(e)
        billboards = None

    project_types = ProjectType.get_published_objects()
    budgets = Budget.get_published_objects()
    deadlines = Deadline.get_published_objects()
    contact_descriptions = ContactDescription.get_published_objects()

    contact_form = ContactForm(type_list=project_types, budget_list=budgets,
                               deadline_list=deadlines, description_list=contact_descriptions)

    context = {'page': page, 'billboards': billboards, 'contact_form': contact_form}
    set_detail_context(request, context)

    template = 'home.html'

    # Add Cache control to response header
    expiry_date = datetime.datetime.now() + datetime.timedelta(days=7)
    response = render(request, template, context)

    response['Cache-Control'] = 'max-age=602000'
    response['Expires'] = expiry_date

    return response

【问题讨论】:

  • 如何提供静态图像?你在使用开发服务器吗?
  • 它似乎没有在开发或生产中添加响应标头。在生产中,我相信 nginx 正在为我的静态文件提供服务。这很奇怪,因为我相信 Apache 正在为网站本身提供服务。也许当您使用网络托管服务提供商时,他们同时使用?

标签: django header response cache-control


【解决方案1】:

听起来您是在按视图设置标题。但是这些视图正在处理特定的 URL,这些 URL 可能不是您的静态图像文件的 URL。所以它不会对那些有任何影响。

如何为静态文件设置标头取决于您为它们提供服务的方式。

  1. 最直接的解决方案是使用whitenoise 应用程序。这在开发和生产中以相同的方式提供来自 Django 的静态文件,并且具有 setting to control the max-age

  2. 如果您使用的是外部服务器(例如 ngnix 或 Apache),则需要对其进行配置以设置任何自定义标头。它与 Django 没有任何关系。

  3. 如果您使用的是 Django 开发服务器,则必须 opt out 让它自动处理静态文件,而是使用设置标题的自定义视图。 (或者你可以在使用开发服务器时不打扰。)

【讨论】:

  • 谢谢凯文。我想配置我的 Apache 服务器,但我注意到在我的实时站点上检查我的图像时,它说服务器是 nginix。你知道为什么会这样吗?你认为配置我的 Apache 服务器仍然会对浏览器缓存产生影响吗?
  • @TimothyJosephBaney:嗯,抱歉,我不知道为什么会这样。您表示您使用的是网络托管服务提供商,您可能需要联系他们的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2018-04-29
  • 2021-08-26
  • 2011-10-01
  • 2010-12-27
  • 2020-05-26
相关资源
最近更新 更多