Proteção CSRF no Django 1.4
Eu estou tentando aprender django trabalhando através de "The Django Book", e estou tendo um problema com a proteção do CSRF. Eu encontrei muitas sugestões aqui, mas nenhuma parece funcionar para mim.
Usando o Chrome, recebo a mensagem:CSRF token missing or incorrect
.
Usando o Internet Explorer, recebo a mensagem:CSRF cookie not set
.
Se eu comentar'django.middleware.csrf.CsrfViewMiddleware'
em settings.py, tudo parece funcionar (embora nada seja enviado para o endereço falso, é claro). Eu tentei colocar umcsrf_protect
decorador na minha opinião, mas isso não ajuda. Eu também tentei comentar a chamada parasend_mail
, e eu ainda recebo uma falha de CSRF, então aparentemente é o ContactForm que está causando o problema.
(Estou usando o django 1.4.1.)
O que eu preciso fazer?
views.pyfrom django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from contact.forms import ContactForm
from django.template import RequestContext
from django.core.mail import send_mail
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(
cd['subject'],
cd['message'],
cd.get('email', '[email protected]'),
['[email protected]'],
)
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form}, context_instance=RequestContext(request))
def thanks(request):
return HttpResponse("Thanks for the feedback")
forms.pyfrom django import forms
class ContactForm(forms.Form):
subject = forms.CharField()
email = forms.EmailField(required=False)
message = forms.CharField()
contact_form.html<html>
<head>
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1>
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.
</p>
{% endif %}
<form action="" method="post">
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Submit">
</form>
</body>
</html>