2010-12-28 25 views
20

Otrzymuję komunikat o niepowodzeniu weryfikacji CSRF podczas próby utworzenia prostego formularza z samouczka. Zrobiłem trochę badań w to, co weryfikacji CSRF faktycznie jest i według mojej wiedzy, w celu wykorzystania go trzeba jedną z tych csrf_token znaczników w HTML, ale nie mam, żeDjango - weryfikacja CSRF nie powiodła się

Oto mój szablon:

<form action="/testapp1/contact/" method="post"> 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
</form> 

dość proste, położony na contact.html

Oto mój URLconf: z django.conf.urls.defaults import *

urlpatterns=patterns('testapp1.views', 
    (r'^$', 'index'), 
    (r'^contact/$','contact') 
) 

Nazwa aplikacji to testapp1. Kiedy wpisuję mój adres URL (http: // localhost: 8000/testapp1/contact), poprawnie przejdę do formularza. Następnie, po przesłaniu formularza, pojawia się błąd weryfikacji.

Oto mój widok, choć nie sądzę, że to istotne:

def contact(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = ContactForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      subject = form.cleaned_data['subject'] 
      message = form.cleaned_data['message'] 
      sender = form.cleaned_data['sender'] 
      cc_myself = form.cleaned_data['cc_myself'] 
      recipients = ['[email protected]'] 
      if cc_myself: 
       recipients.append(sender) 
      print 'Sending Mail:'+subject+','+message+','+sender+','+recipients 
      return HttpResponseRedirect('/thanks/') # Redirect after POST 
    else: 
     form = ContactForm() # An unbound form 

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

Odpowiedz

30

. włącz {% csrf_token %}wewnątrz znacznik formularza w szablonie.

. używać RequestContext w render_to_response

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

[Update]

Obecnie użyć render zamiast render_to_response (ten sam efekt mniej pisania)

return render(request, 'contact.html', {form: form}) 
+0

Ya I właśnie Götte do pracy. Sądzę, że myślałem, że ochrona CSRF jest opcjonalna. Najwyraźniej, jeśli prześlesz formularz, POTRZEBUJESZ skorzystać z CSRF lub nie zadziała. No cóż. Dzięki – JPC

+2

@ JPC: to zależy od konfiguracji. Jeśli używasz oprogramowania pośredniczącego CSRF, niż jest to wymagane, chyba że używasz dekoratora 'csrf_excempt'. Jeśli go nie używasz, nie jest to wymagane, chyba że używasz dekoratora 'csrf_protect'. – Wolph

+1

należy również "importować z django.template import RequestContext" – northben

2

Na Django 1.4

ustawienia. py

MIDDLEWARE_CLASSES = (
... 
'django.middleware.csrf.CsrfViewMiddleware', 
) 

view.py

from django.template.defaulttags import csrf_token 
from django.shortcuts import render 

@csrf_token 
def home(request): 
    """home page""" 
    return render(request, 
     'template.html', 
      {} 
    ) 

template.html

<form action=""> 
    {% csrf_token %} 
.... 
</form> 
3

views.py:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def my_view(request): 
    return render_to_response('mytemplate.html', context_instance=RequestContext(request)) 

mytemlate.html:

<form action="/someurls/" method="POST">{% csrf_token %} 
Powiązane problemy