Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django';s基于类的泛型视图_Python_Django_Http_Etag - Fatal编程技术网

Python 在Django';s基于类的泛型视图

Python 在Django';s基于类的泛型视图,python,django,http,etag,Python,Django,Http,Etag,我最近将我的一个Django项目中的所有视图迁移到新的基于类的视图。对于经典的基于函数的Django视图,有一个方便的decoratorDjango.views.decorators.http.condition,如果缓存的副本与您指定的条件匹配,则可以使用它绕过整个视图处理。我在文档和源代码中搜索了所有地方,但在新的基于类的视图中找不到任何实现 所以我的问题是:您建议我如何为基于类的视图实现条件视图处理?缓存是一个复杂的问题,但最近的趋势(服务器中的数据/片段缓存和浏览器中的资产缓存)表明,最

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


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

缓存是一个复杂的问题,但最近的趋势(服务器中的数据/片段缓存和浏览器中的资产缓存)表明,最好不要花时间解决缓存失效问题,但只需执行本文中描述的操作:

此技术应用于Django的真实示例:


这个问题似乎还没有一个好的答案。对于只设置函数属性的装饰器(例如,
csrf_-emption
),将它们应用于视图类的
分派
方法就足够了,但这显然不适用于
条件
装饰器,因为它们期望第一个函数参数是请求对象,而不是
self

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

  • 将装饰器应用于生成的视图函数。通用视图功能实际上可以归结为从类构建视图函数的一种方式,因此晚些时候应用decorator可能是一种选择。大概是这样的:

    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描述的第二个选项基本相同。