我正在使用Django版本1.4.2。 我已经实现了这个简单的表单示例(受djangobook启发):
# views.py from django.shortcuts import render from django.http import HttpResponseRedirect from django.core.mail import send_mail from mysite.contact.forms import ContactForm 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', 'noreply@example.com'), ['siteowner@example.com'], ) return HttpResponseRedirect('/contact/thanks/') else: form = ContactForm() return render(request, 'contact_form.html', {'form': form}) # 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 }} {% csrf_token %} </table> <input type="submit" value="Submit"> </form> </body> </html> # forms.py from django import forms class ContactForm(forms.Form): subject = forms.CharField() email = forms.EmailField(required=False) message = forms.CharField()
一切工作正常,我试过的所有浏览器(铬,maxthon,firefox),但在IE9,我得到了HTTP 403拒绝。
任何线索是什么原因造成的?
编辑:深入调查后,我发现问题来自:当问空表单,导航器收到csrf cookie,但由于未知的原因,发送表单时不发送这个cookie。 这个问题似乎只有当cookie来自pythonanywhere.com上的nginx服务器时,当我从我自己的apache服务器进行testing时,cookie才会发回。
以下是从服务器捕获的两个头文件:
HTTP/1.1 200 OK Server: nginx/1.2.5 Date: Wed, 21 Nov 2012 13:56:31 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Cookie Set-Cookie: csrftoken=1AJjzkbUgJdKAmkbiHicJ3or2Mfi6AbD; expires=Wed, 20-Nov-2013 13:56:31 GMT; Max-Age=31449600; Path=/ HTTP/1.1 200 OK Date: Wed, 21 Nov 2012 13:56:50 GMT Server: Apache/2.2.15 (CentOS) Vary: Cookie Set-Cookie: csrftoken=2iMZSH1s0vJnEt4tRRY7FciT1Q7orrVF; expires=Wed, 20-Nov-2013 13:56:50 GMT; Max-Age=31449600; Path=/ Keep-Alive: timeout=180, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8
唯一显着的区别似乎是apache的Kee-Alive头文件…
你认为它可以从那里?
{% csrf_token %}
输出一个<input type="hidden" ...>
标记,也许IE9忽略它,因为它是表的直接子{% csrf_token %}
,而不是在单元格内。
尝试将<input type="submit" value="Submit">
{% csrf_token %}
移动到<input type="submit" value="Submit">
旁边
在Django的#17157票据中指出,问题在于Internet Explorer默认阻止第三方Cookie。 因此,您可以为所有网站启用第三方Cookie,或者仅在浏览器设置中为您的网站启用第三方Cookie。 这里是如何做到这一点在IE 7(从这个链接 ):
选项1:为所有站点启用第三方Cookie
要么
选项2:只为Feedjit.com启用第三方Cookie