我最近将 Django 项目之一中的所有视图迁移到新的基于类的视图。对于经典的基于函数的 Django 视图,有一个方便的装饰器django.views.decorators.http.condition
如果存在与您指定的条件匹配的缓存副本,则可以使用它来绕过整个视图处理。我在文档和源代码中到处搜索,但找不到新的基于类的视图的任何实现。
所以我的问题是:您建议我如何为基于类的视图实现条件视图处理?
看来这个问题还没有一个很好的答案。对于仅设置函数属性的装饰器(例如csrf_exempt
),将它们应用到视图类就足够了dispatch
方法,但这显然不适用于condition
装饰器,因为他们期望第一个函数参数是请求对象而不是self
.
实现这一目标的两种方法包括:
-
将装饰器应用到生成的视图函数。通用视图功能实际上可以归结为一种从类构建视图函数的方法,因此稍后应用装饰器可能是一种选择。像这样的东西:
f = ViewClass.as_view()
f = condition(...)(f)
这样做的缺点是您无法从传递给的函数访问视图类condition
装饰师。如果你打电话的话也不是很方便as_view
urlconf 中的方法。
-
委托给一个简单的函数,您可以将装饰器应用到视图内部dispatch
方法。像这样的东西:
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)
这样做的好处是,您可以在应用装饰器时访问视图类实例,因此您可以将实例方法用于缓存验证函数。缺点是装饰器将在每次调用视图时运行,但这对于这个特定的装饰器来说似乎不是问题。
不过,这两种解决方案都有其问题,因此也许值得提交错误报告或在 django 用户邮件列表上询问如何最好地结合这两个概念。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)