我正在尝试通过利用浏览器缓存来优化我的Django Web应用程序。我在home视图函数返回的响应中为max-age设置了一个Cache-Control标头,等于一年。然而,当我加载我的网站,并检查我的主页上的一些图像的响应标题时,缓存控制标题不存在。我尝试了两种不同的设置响应头的方法。首先,我尝试使用Django内置的缓存控制装饰器。我还尝试简单地获取渲染的响应,并在其return语句之前在我的视图函数中设置标题。静态图像是否以不同方式缓存?
查看功能
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
答案 0 :(得分:1)
听起来你是在每个视图的基础上设置标题。但是这些视图正在处理特定的URL,这可能不是静态图像文件的URL。所以它对那些没有任何影响。
如何设置静态文件的标头取决于您如何为它们提供服务。
最直接的解决方案是使用whitenoise
应用。这在开发和生产中以相同的方式提供来自Django的静态文件,并且具有setting to control the max-age
。
如果您使用的是外部服务器(例如ngnix或Apache),则需要将其配置为设置任何自定义标头。它与Django没有任何关系。
如果您正在使用Django开发服务器,则必须opt out让它自动处理静态文件,而是使用自定义视图来设置标头。 (或者在使用开发服务器时你可能不会打扰。)