注销时Django CSRF验证失败

时间:2013-09-18 14:30:06

标签: python django csrf

我遇到CSRF的问题。我尝试使用自定义简单视图注销用户。 首先,main.html(我开始了,所以很简单)

<div id="user">
    <form id="login_form" method="post" action="logout/">
        {% csrf_token %}
        <p>Witaj {{user.first_name}}!</p>
        <input type="submit" class="login_button" name="logout" value="Wyloguj"/>
    </form>
</div>

urls.py

url(r'^main/logout/$',views.flogout, name='flogout'),

views.py

def flogout(request):
    logout(request)
    return HttpResponseRedirect("/index/")

我得到了403 Forbidden - CSRF验证失败了。请求中止。

2 个答案:

答案 0 :(得分:1)

退出,应该只是一个链接,不需要表格。我就是这样做的:

<强> URLS.PY

url(r'^logout', views.logout),  # Adding a '$' at the end of the url means that you cannot add any get parameters.

<强> VIEWS.PY

from django.contrib.auth import logout as auth_logout
def logout(request):
    auth_logout(request)
    return HttpResponseRedirect("/index/")

简单地添加指向退出视图的链接就足够了,不需要表单或CSRF

答案 1 :(得分:-2)

每当您遇到“403 Forbidden - CSRF验证失败时,请检查清单。请求已中止。”错误:

  1. 检查settings.py文件中的MIDDLEWARE_CLASSES元组是否具有此中间件: 'django.middleware.csrf.CsrfViewMiddleware'

  2. 检查元素中是否有{%csrf_token%}标记。 *请注意,仅当表单转到内部网址时才适用。

  3. 检查settings.py文件中的TEMPLATE_CONTEXT_PROCESSORS元组是否有此中间件:'django.core.context_processors.csrf'

  4. 检查您是否在views.py文件中导入了以下来自'django.shortcuts import render_to_response'的行。在函数中,您将不得不像RequestContext一样使用render_to_response:

  5. 返回render_to_response('main.html',context_instance = RequestContext(request))

    您的错误在views.py中。你不应该'返回HttpResponseRedirect'而是使用'return render_to_response'代替。