2012-12-13 64 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