2012-12-13 37 views
-1

我有urls.pyDjango 1.4 CSRF如何工作?

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

但是这给了我这个错误:

Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
CSRF cookie not set.

在管理界面,我有同样的问题。

我能做些什么来解决这个问题?

回答

0

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

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

+0

我使用标准的Django应用程序,它在urls.py中看到:django.contrib.auth 在管理界面我有同样的问题。 – lmasikl

+0

@lmasikl:更新了答案看看 –

+0

不适合我( – lmasikl