1

에서 일반적인 전망 vary_on_headers와 login_required 이 URL에 대한 vary_on_headers 꾸미기는 작동하지만 작동하지 않습니다.사용은이 같은, 내가 urls.py 파일에 login_required 장식을 사용하여 일반적인 전망을 가지고있어 장고

나는 시도했다 :

(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' 

어떤 일이 벌어지고 있는지 그리고이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변

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())), 
+0

캐시 미들웨어가 이미 'HTTP_'를 추가했기 때문에 여기에 추가 할 올바른 헤더가 X_REQUESTED_WITH 인 것 같습니다. – duduklein

+0

확인, 올바른 답변으로 답변을 업데이트했습니다. – Alasdair

1

사용자 정의 뷰 클래스 (또는 기본 클래스)가있는 경우,

는 다음 시도 모든 전화를 as_view()으로 꾸미려면 을 사용하여 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) 

믹스 인을 만들 수도 있습니다.

관련 문제