我有一个通用视图,我在urls.py文件中使用login_required装饰器,如下所示:
(r'^my-url/$', login_required(ListView.as_view())),
现在,我想对这个网址使用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'
关于可能发生的事情以及如何解决这个问题的任何想法?
答案 0 :(得分:3)
您已将正在装饰的视图功能与vary_on_headers
decorator的标题参数混合在一起。
尝试以下方法:
(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())),
答案 1 :(得分:2)
如果您有自定义视图类(或基类),则可以使用as_view()
来装饰视图的method_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。