Python 在Django';s基于类的泛型视图
我最近将我的一个Django项目中的所有视图迁移到新的基于类的视图。对于经典的基于函数的Django视图,有一个方便的decoratorPython 在Django';s基于类的泛型视图,python,django,http,etag,Python,Django,Http,Etag,我最近将我的一个Django项目中的所有视图迁移到新的基于类的视图。对于经典的基于函数的Django视图,有一个方便的decoratorDjango.views.decorators.http.condition,如果缓存的副本与您指定的条件匹配,则可以使用它绕过整个视图处理。我在文档和源代码中搜索了所有地方,但在新的基于类的视图中找不到任何实现 所以我的问题是:您建议我如何为基于类的视图实现条件视图处理?缓存是一个复杂的问题,但最近的趋势(服务器中的数据/片段缓存和浏览器中的资产缓存)表明,最
Django.views.decorators.http.condition
,如果缓存的副本与您指定的条件匹配,则可以使用它绕过整个视图处理。我在文档和源代码中搜索了所有地方,但在新的基于类的视图中找不到任何实现
所以我的问题是:您建议我如何为基于类的视图实现条件视图处理?缓存是一个复杂的问题,但最近的趋势(服务器中的数据/片段缓存和浏览器中的资产缓存)表明,最好不要花时间解决缓存失效问题,但只需执行本文中描述的操作: 此技术应用于Django的真实示例:
这个问题似乎还没有一个好的答案。对于只设置函数属性的装饰器(例如,
csrf_-emption
),将它们应用于视图类的分派
方法就足够了,但这显然不适用于条件
装饰器,因为它们期望第一个函数参数是请求对象,而不是self
实现这一目标的两种方法包括:
f = ViewClass.as_view()
f = condition(...)(f)
def dispatch(self, request, *args, **kwargs):
@condition(...)
def _dispatch(request, *args, **kwargs):
return super(ViewClass, self).dispatch(request, *args, **kwargs)
return _dispatch(request, *args, **kwargs)
这样做的缺点是,您无法从传递给条件
装饰器的函数访问视图类。如果在urlconf中调用as_view
方法,也不是很方便dispatch
方法中应用装饰器。大概是这样的:
f = ViewClass.as_view()
f = condition(...)(f)
def dispatch(self, request, *args, **kwargs):
@condition(...)
def _dispatch(request, *args, **kwargs):
return super(ViewClass, self).dispatch(request, *args, **kwargs)
return _dispatch(request, *args, **kwargs)
这样做的好处是,在应用decorator时可以访问视图类实例,因此可以使用实例方法实现缓存验证功能。缺点是每次调用视图时都会运行decorator,但这对于这个特定的decorator来说并不是问题不过,这两种解决方案都有各自的问题,因此也许值得提交一份bug报告或在django用户邮件列表上询问这两个概念如何最好地结合起来。您可以使用以下方法:
def conditional(**kwargs):
'''A wrapper around :func:`django.views.decorators.http.condition` that
works for methods (i.e. class-based views).
'''
from django.views.decorators.http import condition
from django.utils.decorators import method_decorator
return method_decorator(condition(**kwargs))
实际上,我最终缓存了网站上的所有内容,因为它阅读量很大,管理员每周只编辑几次。当某些内容发生变化时,我会清除整个缓存,让“缓存机器人”重新访问最常用的页面。技术2也适用于Django Syndication框架,只需覆盖
\uuu调用,而不是调度
。如果您查看方法装饰程序
,您将看到这与James描述的第二个选项基本相同。