2013-07-06 6 views
3

내 Django 프로젝트에서 업로드 중에 파일 스트림을 수정하는 기능을 갖기 위해 파일 업로드 처리기 튜플을 "즉시"as documented으로 수정해야합니다. 뷰에서 데이터를 처리기에 제공해야하기 때문에이 코드를 "즉시"필요로합니다 (아래 코드의 setup() 메서드 참조).클래스 기반 CSRF 미들웨어보기에서 파일 업로드 처리기를 수정하려면 어떻게합니까?

설명서에는 CSRF 보호를 사용하는 경우이를 수행하는 방법에 대해서도 언급되어 있습니다. 이것은 CSRF 보호 미들웨어가 요청의 POST 데이터에 액세스하여 내 View가 호출되기 전에 파일 업로드 프로세스가 실행되기 때문에 특별합니다. 그러나 이전 스타일의 뷰에 대해서만 설명되어 있지만 클래스 기반 뷰를 사용하여 동일하게 수행하려고합니다. 나는의 조합을 가질 수있는 방법 그래서

Traceback (most recent call last): 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper 
    return bound_func(*args, **kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/utils/decorators.py", line 21, in bound_func 
    return func(self, *args2, **kwargs2) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper 
    return bound_func(*args, **kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/utils/decorators.py", line 21, in bound_func 
    return func(self, *args2, **kwargs2) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 77, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/some/path/to/project/myapp/views.py", line, in dispatch 
    return super(MyView, self).dispatch(*args, **kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/views/generic/base.py", line 86, in dispatch 
    return handler(request, *args, **kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/utils/decorators.py", line 87, in _wrapped_view 
    result = middleware.process_view(request, view_func, args, kwargs) 
    File "/some/path/to/Envs/someenv/local/lib/python2.7/site-packages/django/middleware/csrf.py", line 95, in process_view 
    request.COOKIES[settings.CSRF_COOKIE_NAME]) 
AttributeError: 'MyView' object has no attribute 'COOKIES' 

:

from django.views.decorators.csrf import csrf_exempt, csrf_protect 

class MyView(TemplateResponseMixin, ContextMixin, View): 
    template_name = 'mytemplate.html' 

    def __init__(self, *args, **kwargs): 
     self.fileuploadhandler = MyUploadHandler() 
     super(MyView, self).__init__(*args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     return self.render_to_response(
      self.get_context_data(form=MyForm())) 

    #@csrf_protect        # this gives the error below 
    def post(self, request, *args, **kwargs): 
     # Set up the FileUploadHandler 
     # SNIP - some data is being gathered here 
     self.fileuploadhandler.setup(mydata) 

     # Process the POST data by loading the ModelForm 
     form = MyForm(request.POST, request.FILES) 
     if form.is_valid(): 
      # SNIP processing Form 
     else: 
      return self.render_to_response(self.get_context_data(form=form)) 

    def get_context_data(self, **kwargs): 
     context = super(MyView, self).get_context_data(**kwargs) 
     return context 

    @csrf_exempt         # I have to do this 
    def dispatch(self, *args, **kwargs): 
     self.request.upload_handlers.insert(0, self.fileuploadhandler) 
     return super(MyView, self).dispatch(*args, **kwargs) 

post 방법에 @csrf_protect를 사용할 때 내가 오류는 다음과 같습니다

내보기의 최소한의 코드 예제 내 View의 세 가지 속성을 따르면?

  • 클래스의 사용을 기반으로 뷰 "즉석에서"파일 업로드 핸들러를 수정하는
  • 능력은보기에
  • 적절한 CSRF 보호는

장고 버전 사용 : 1.5.1, 파이썬 2.7.3.

답변

2

동료의 도움을 받아 CSRF 미들웨어를 사용하여보기 내에서 수동으로 토큰을 확인하는 추악한 방법을 발견했습니다.

from django.views.decorators.csrf import csrf_exempt, csrf_protect 
from django.middleware.csrf import CsrfViewMiddleware 

class MyView(TemplateResponseMixin, ContextMixin, View): 
    template_name = 'mytemplate.html' 

    def __init__(self, *args, **kwargs): 
     self.fileuploadhandler = MyUploadHandler() 
     super(MyView, self).__init__(*args, **kwargs) 

    def post(self, request, *args, **kwargs): 
     # Set up the FileUploadHandler 
     # SNIP - some data is being gathered here 
     self.fileuploadhandler.setup(mydata) 

     # Check CSRF manually *after* initializing the file upload handlers. 
     csrf_checker = CsrfViewMiddleware() 
     csrf_error = csrf_checker.process_view(request, None, None, None) 
     if csrf_error is not None: 
      return csrf_error # csrf_error is the regular CSRF error View 

     # Process the POST data by loading the ModelForm 
     form = MyForm(request.POST, request.FILES) 
     if form.is_valid(): 
      # SNIP processing Form 
     else: 
      return self.render_to_response(self.get_context_data(form=form)) 

    @csrf_exempt # Important to skip CSRF checking here. 
    def dispatch(self, *args, **kwargs): 
     self.request.upload_handlers.insert(0, self.fileuploadhandler) 
     return super(MyView, self).dispatch(*args, **kwargs) 

내가 여기 생각 장고 개선의 여지있어 - CSRF 미들웨어는 내 의견으로는 process_view에 싸여 별도의 check_token 방법을 제공한다 : 여기 제조법입니다.