2012-07-13 2 views
1

타사 서버의 POST이 필요합니다. 제 3 자 서버의 게시물을 허용하려면 @csrf_exempt 데코레이터를 사용해야 함을 이해합니다. 나는 Ubuntu 12.04에서 Django 1.4와 Python 2.7을 사용하고 있습니다.@csrf_exempt 사용 및 동일한보기에서 CSRF 토큰 생성

이제 내보기는 원래 POST의 정보가 들어있는 숨겨진 필드뿐만 아니라 사용자가 채울 필드를 포함 할 바인드되지 않은 양식을 생성합니다. 따라서 첫 번째 POST은 두 번째 POST을 시작합니다.

두 번째 POST은 내 서버에서 내 서버의 다른보기로 전송됩니다. 내 양식에 CSRF 토큰을 생성하는 방법을 알아 내려고하고 있습니다.

나는 정확히 documentation에서 읽은 것을 시도하고 있습니다. views.py에서

내 코드 :

지금 템플릿 측에서 할 일을
from django.core.context_processors import csrf 
from django.shortcuts import render_to_response 
from gateway_interface.post_handling import PostHandling 

@csrf_exempt 
def requestNewPaymentInfo(request): 

    c = {} 
    c.update(csrf(request)) 

    # Gather information posted 
    if (request.method == "POST"): 
     # Create the initialization dictionary based on POST values 
     postHandling = PostHandling() 
     post_dict = postHandling.createDictionary(request) 

     # Create the form 
     form = addPaymentForm(initial = post_dict) 

     return render_to_response('requestNewPaymentInfo.html', { 'form' : form }, c) 

?!? 다시 말하지만, 문서에서 나는 다음을 수행해야한다고 생각 :

<form action="/addPayment/" method="post"> 
    {% csrf_token %} 
</form> 

내가 제 3 자 서버에서 POST을 수행하여이 문제를 테스트합니다. 때로는 양식이 유효한 CSRF 토큰으로 보이는 것으로 생성 된 것을 볼 수 있습니다. 나는이 오류까지 얻을 계속 나는 CSRF verification failed 오류가 발생하면

Forbidden (403) 
CSRF verification failed. Request aborted. 

:

Django Version: 1.4 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'gateway_interface') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py" in wrapped_view 
    77.   return view_func(*args, **kwargs) 
File "/home/tokeniz/tokeniz/gateway_interface/views.py" in requestNewPaymentInfo 
    64.   return render_to_response('requestNewPaymentInfo.html', { 'form' : form }, c) 
File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py" in render_to_response 
    20.  return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py" in render_to_string 
    178.   context_instance.pop() 

Exception Type: TypeError at /requestNewPaymentInfo/ 
Exception Value: pop expected at least 1 arguments, got 0 

가 그럼 난 결국이 오류를 얻을 것이다 :

는 가끔 다음과 같습니다 실패를 참조 쿠키를 지우고 다시 시작합니다.

누구든지 내가 뭘 잘못하고 있다고 말할 수 있습니까? 나는 그것이 CSRF 토큰을 어떻게 생성하는지와 관련이 있다는 것을 알 수 있습니다. 문서의 내용을 기반으로 프로세스가 어떻게 작동하는지 이해할 수 없습니다. 내보기에 c은 무엇입니까? 정보가 채워지고 render_to_response으로 전달되는 빈 사전. 좋습니다. 그런데 어떻게 템플릿에서 사용하고 있습니까?

<form action="/addPayment/" method="post"> 
    {% c.csrf_token %} 
</form> 

그렇지 않다면, 왜 :

내 템플릿이 같은 뭔가를해야할까요? 장고는이 cCSRF 토큰이 있다는 것을 어떻게 알 수 있습니까?

도움을 주시면 감사하겠습니다.

답변

4

문제를 해결하려면 몇 가지 사항을 명확히 설명해주십시오. 상황템플릿 : 요컨대

장고의 템플릿 시스템은 데이터의 두 가지 작동합니다.

당신이 {{ foo }} 같은 템플릿 파일에 표시 할 변수를 넣어

은, 장고는 스테로이드에 dict가, 그 변수의 값을 찾을 수 컨텍스트 인스턴스을, 해당 내부를 들여다 것입니다.

이제 render_to_response으로 두 번째 매개 변수 인 dict으로 전달하는 것은 본질적으로 템플릿의 컨텍스트에 넣고 싶은 데이터이므로 사용할 수 있습니다. 세 번째 매개 변수는 데이터 자체가 아닌 Context 인스턴스이며, 사용자 정의해야 할 때 유용 할 수 있습니다.

좋아, 그래서 당신의 예를 살펴 보자, 여기

return render_to_response('requestNewPaymentInfo.html', { 'form' : form }, c) 

, 실수 독서 문서 예제를 만들어, 당신은하지 컨텍스트 컨텍스트로 예를c을 넣어 데이터, 따라서 토큰 didn를 템플릿으로 만들지도 않고, django가 Context 객체를 기대하고 있지만 그저 dict를 얻은 이상한 오류가 있습니다.

c.update({'form': form}) 
return render_to_response('requestNewPaymentInfo.html', c) 

을 그리고 템플릿 내부 :

그래서 당신은 템플릿 데이터 내부 CSRF 토큰을 전달해야, 해결하는

{% csrf_token %} 

나는, 그것은 아주 잘 작성 template system explanation for programmers을 읽는 건의 할 것입니다.