gpt4 book ai didi

python - 在 Django 的基于类的通用 View 中使用 ETag/Last-Modified 装饰器

转载 作者:太空狗 更新时间:2023-10-29 21:01:29 26 4
gpt4 key购买 nike

我最近将我的一个 Django 项目中的所有 View 都迁移到了新的基于类的项目中。对于经典的基于函数的 Django View ,有一个方便的装饰器 django.views.decorators.http.condition 如果存在与您指定的条件匹配的缓存副本,可用于绕过整个 View 处理.我在文档和源代码中到处搜索,但找不到新的基于类的 View 的任何实现。

所以我的问题是:您建议我如何为基于类的 View 实现条件 View 处理?

最佳答案

看起来这个问题还没有很好的答案。对于只设置函数属性的装饰器(例如csrf_exempt),将它们应用到 View 类的dispatch方法就足够了,但这显然不适用于condition 装饰器,因为他们希望第一个函数参数是请求对象而不是 self

实现这一目标的两种方法包括:

  1. 将装饰器应用于生成的 View 函数。通用 View 功能实际上归结为一种从类构建 View 函数的方式,因此后期应用装饰器可能是一种选择。像这样:

    f = ViewClass.as_view()
    f = condition(...)(f)

    这样做的缺点是您无法从传递给 condition 装饰器的函数中访问 View 类。如果在 urlconf 中调用 as_view 方法也不是很方便。

  2. 委托(delegate)给一个简单的函数,您可以在 View 的 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)

    这个的好处是您可以在应用装饰器时访问 View 类实例,因此您可以将实例方法用于缓存验证功能。缺点是装饰器将在每次调用 View 时运行,但这对于这个特定的装饰器来说似乎不是问题。

虽然这两种解决方案都有其问题,因此也许值得提交错误报告或在 django 用户邮件列表上询问如何最好地结合这两个概念。

关于python - 在 Django 的基于类的通用 View 中使用 ETag/Last-Modified 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12993951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com