2011-01-23 10 views
8

Django 1.2 konsekwentnie daje mi ten błąd weryfikacji CSRF, gdy wykonuję formularz POST. I "myśleć" Zrobiłem wszystko, co zadane w Django 1.2 Dokumenty, a mianowicie,Django 1.2.4 Weryfikacja CSRF nie powiodła się

  1. Upewnić MIDDLEWARE_CLASSES jest dołączony 'django.middleware.csrf.CsrfViewMiddleware'

  2. Zapewnienie {% csrf_token%}

    <form action="/words/new/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
        <input type="submit" value="Enter" /> 
    </form> 
    
  3. Używaj RequestContext w mojej odpowiedzi

    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, 
        }) 
    

Należy pamiętać, że akcja GET działa w tej funkcji. Więc myślę, że używam prawa render_to_response.

Próbowałem nawet rzucić dekorator @csrf_protect i nawet to nie działało. Nie mam pomysłów i niedługo się udławię moim laptopem.

Każda rzecz, o której myślisz?

Dzięki!

+0

Sprawdź kod HTML w przeglądarce, aby upewnić się, że pole tokenu csrf tam jest. Następnie zrzuć odpowiedzi POST, aby sprawdzić, czy wraca do widoku. – Spacedman

Odpowiedz

7

Nie podążasz za # 3. Należy użyć RequestContext przy renderowaniu szablonu pokazującego formularz. Nie jest to konieczne na stronie z podziękowaniami.

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

I tak na marginesie, należy użyć PRG pattern zamiast renderowania strony dzięki bezpośrednio.

+0

To jest dla akcji GET. Jeśli spojrzysz na kod ponownie, zawarłem to dla warunku, gdy request.method == 'POST'. – Bryan

+3

@bryli: Dokładnie to jest problem. Procesor kontekstowy CSRF potrzebuje kontekstu żądania podczas tworzenia tokena i umieszczania go w kontekście szablonu (prawdopodobnie) nie podczas sprawdzania go w POST. – AndiDog

+0

Pomógł mi, dzięki! – Chris