2011-01-23 4 views
8

Django 1.2는 POST 양식을 수행 할 때 일관되게이 CSRF 확인 오류를 제공합니다. 나는Django 1.2.4 CSRF 확인 실패

  1. 이 MIDDLEWARE_CLASSES가 'django.middleware.csrf.CsrfViewMiddleware'

  2. 은 {% 보장에 포함되어 있는지 확인, 내가 즉 장고 1.2 문서에서 요구하는 모든 일을했습니다 "생각" 내 대답에 csrf_token %}

    <form action="/words/new/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
        <input type="submit" value="Enter" /> 
    </form> 
    
  3. 사용 RequestContext를

    def create(request): 
        if request.method == 'POST': 
         form = DefinitionForm(request.POST) 
         if form.is_valid(): 
          form.save() 
         c = {} 
         return render_to_response('dict/thanks.html',c, 
                context_instance=RequestContext(request)) 
        else: 
         form = DefinitionForm() 
        return render_to_response('dict/create_definition.html', { 
         'form' : form, 
        }) 
    

GET 동작은이 기능에서 작동합니다. 그래서 나는 render_to_response를 올바르게 사용하고 있다고 생각합니다.

나는 심지어 @csrf_protect 데코레이터를 넣으려고했는데 작동하지 않는 것조차 보였습니다. 나는 아이디어가 없으며 노트북을 가지고 자신을 질식시킬 것입니다.

여러분이 생각할 수있는 것이 있습니까?

감사합니다.

+0

브라우저에서 HTML을 확인하여 csrf 토큰 필드가 있는지 확인하십시오. 그런 다음 POST 응답을 덤프하여 다시보기로 돌아 왔는지 확인하십시오. – Spacedman

답변

7

3 번을 따르고 있지 않습니다. RequestContext은 서식을 나타내는 서식 파일의 렌더링과 함께 사용해야합니다. 감사 페이지에는 필요 없습니다.

return render_to_response('dict/create_definition.html', { 
    'form' : form, 
}, context_instance=RequestContext(request)) 

그리고 보조 노트, 당신은 직접 감사 페이지를 렌더링하는 대신 PRG pattern를 사용해야합니다.

+0

이것은 GET 작업을위한 것입니다. 코드를 다시 보면 request.method == 'POST'인 경우에 해당 코드를 포함했습니다. – Bryan

+3

@bryli : 바로 그게 문제입니다. CSRF 컨텍스트 프로세서는 토큰을 생성하고 템플릿 컨텍스트에 넣을 때 요청 컨텍스트를 필요로합니다 (POST에서 확인할 때). – AndiDog

+0

도와 줘서 고마워! – Chris