Django 1.4 CSRF如何工作?

时间:2012-12-13 16:04:04

标签: python django csrf django-csrf

我有 urls.py

from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(
        r'^login/$', 
        'django.contrib.auth.views.login', 
        {'template_name': 'loyalty/login.html'}, 
        name='login'
    ),
    url(
        r'^logout/$', 
        'django.contrib.auth.views.logout', 
        {'next_page': '/', },
        name='logout'),
)

并拥有模板 login.html *

{% extends "loyalty/auth.html" %}
  {% load i18n %}  

  {% block auth_form %}
  {% if messages %}
  <ul>
    {% for message in messages %}
    <li>{{ message }}</li>
    {% endfor %}
  </ul>
  {% endif %}

  <form action="" method="post" id="login-form">{% csrf_token %}
    {% if form.username.errors %}{{ form.username.errors }}{% endif %}
    {{ form.username }}
    {% if form.password.errors %}{{ form.password.errors }}{% endif %}
    {{ form.password }}
    <input type="hidden" name="this_is_the_login_form" value="1" />
    <input type="hidden" name="next" value="{{ next }}" />
    <button type="submit" name="submit">{% trans 'Log in' %}</button>
  </form>
  {% endblock %}

我在 settings.py

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

但这给了我这个错误:

  

禁止(403)
  CSRF验证失败。请求中止。
  帮助
  失败原因:
  未设置CSRF cookie。

在管理界面中,我遇到同样的问题。

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可能没有从视图中传递请求上下文。

示例:

def show_form(request):
    form = MyForm()
    if request.method == 'POST':
         form = MyForm(request.POST)
         if form.is_valid():

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

更新:我建议您重新安排中间件。尝试删除localemiddleware或最后放置它。 django默认值为this

答案 1 :(得分:0)

我解决了这个问题。浏览器问题。尝试了其他浏览器,一切正常。不明白为什么我遇到这个问题,因为我尝试了干净的缓存和cookie。