在Django中,将login_required与vary_on_头一起使用generic view

在Django中,将login_required与vary_on_头一起使用generic view,django,caching,decorator,django-generic-views,login-required,Django,Caching,Decorator,Django Generic Views,Login Required,我有一个通用视图,其中我在url.py文件中使用了login_required decorator,如下所示: (r'^my-url/$', login_required(ListView.as_view())), 现在,我想为这个url使用vary_on_headers装饰器,但我无法让它工作 我试过: (r'^my-url/$', vary_on_headers(login_required(ListView.as_view()),'HTTP_X_REQUESTED_WITH')) 但我

我有一个通用视图,其中我在url.py文件中使用了login_required decorator,如下所示:

(r'^my-url/$', login_required(ListView.as_view())),
现在,我想为这个url使用vary_on_headers装饰器,但我无法让它工作

我试过:

(r'^my-url/$', vary_on_headers(login_required(ListView.as_view()),'HTTP_X_REQUESTED_WITH'))
但我在测试中遇到了以下错误:

response = self.client.get('/my-url/', HTTP_X_REQUESTED_WITH='XMLHttpRequest')
  File "/lib/python2.6/site-packages/django/test/client.py", line 439, in get
    response = super(Client, self).get(path, data=data, **extra)
  File "/lib/python2.6/site-packages/django/test/client.py", line 241, in get
    return self.request(**r)
  File "/lib/python2.6/site-packages/django/core/handlers/base.py", line 178, in get_response
    response = middleware_method(request, response)
  File "/lib/python2.6/site-packages/django/middleware/common.py", line 94, in process_response
    if response.status_code == 404:
AttributeError: 'function' object has no attribute 'status_code'
如果我尝试:

(r'^my-url/$', login_required(vary_on_headers(MyProductsView.as_view(),'HTTP_X_REQUESTED_WITH'))),
但我现在得到了以下错误:

response = self.client.get('/my-url/', HTTP_X_REQUESTED_WITH='XMLHttpRequest')
  File "/lib/python2.6/site-packages/django/test/client.py", line 439, in get
    response = super(Client, self).get(path, data=data, **extra)
  File "/lib/python2.6/site-packages/django/test/client.py", line 241, in get
    return self.request(**r)
  File "/lib/python2.6/site-packages/django/core/handlers/base.py", line 178, in get_response
    response = middleware_method(request, response)
  File "/lib/python2.6/site-packages/django/contrib/sessions/middleware.py", line 26, in process_response
    patch_vary_headers(response, ('Cookie',))
  File "/lib/python2.6/site-packages/django/utils/cache.py", line 133, in patch_vary_headers
    if response.has_header('Vary'):
AttributeError: 'function' object has no attribute 'has_header'

关于可能发生的情况以及如何解决此问题,您有什么想法吗?

您将要装饰的视图函数与

请尝试以下操作:

(r'^my-url/$', vary_on_headers('X_REQUESTED_WITH')(login_required(ListView.as_view())),
或者,如果您想以另一种方式应用装饰器:

(r'^my-url/$', login_required(vary_on_headers('X_REQUESTED_WITH')(ListView.as_view())),

您将要装饰的视图函数与的头参数混合在一起

请尝试以下操作:

(r'^my-url/$', vary_on_headers('X_REQUESTED_WITH')(login_required(ListView.as_view())),
或者,如果您想以另一种方式应用装饰器:

(r'^my-url/$', login_required(vary_on_headers('X_REQUESTED_WITH')(ListView.as_view())),

如果您有一个自定义视图类(或基类),则可以使用
method\u decorator
装饰视图的
get
方法,甚至
dispatch
,而不是将对
的每个调用装饰为\u view()

from django.utils.decorators import method_decorator

@method_decorator(vary_on_headers('X-Requested-With'))
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
    return super(MyView, self).dispatch(*args, **kwargs)

您还可以创建一个这样做的mixin。

如果您有一个自定义视图类(或基类),那么您可以使用
方法\u decorator
来装饰视图的
get
方法,甚至
dispatch

from django.utils.decorators import method_decorator

@method_decorator(vary_on_headers('X-Requested-With'))
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
    return super(MyView, self).dispatch(*args, **kwargs)

您也可以创建一个这样做的mixin。

只需一条注释,我发现要在此处添加的正确标头仅为X_REQUESTED_WITH,因为缓存中间件已经向其添加了“HTTP_”。只需一条注释,我发现要在此处添加的正确标头仅为X_REQUESTED_WITH,因为缓存中间件已经向其添加了“HTTP_”