禁止(403)CSRF验证失败。请求中止。即使使用{%csrf_token%}我正在尝试在django中进行登录,但出现此错误,我检查了CSRF文档,但对我来说没有任何用处。
这是HTML:
<body> <section class="container"> <div class="login"> <h1>Login to Web App</h1> {% if form.errors %} <p class="error">Lo sentimos, la combinacion de usuario y contrasena no es correcta!</p> {% endif %} <form action="/accounts/auth/" method="post"> {% csrf_token %} <input type='hidden' name='csrfmiddlewaretoken' value='randomchars'/> <p><input name="username" type="text" name="login" value="" placeholder="Username"></p> <p><input name="password" type="password" name="password" value="" placeholder="Password"></p> <p class="submit"><input type="submit" name="commit" value="Login"></p> </form> </div> </body>
就像你在上面看到的那样,我使用了{%csrf_token%},并且在已安装的应用程序中有“ django.middleware.csrf.CsrfViewMiddleware”。
我的看法是:
from django.http import HttpResponse,HttpResponseRedirect from django.template.loader import get_template from django.template import Context from datetime import datetime from django.shortcuts import render_to_response from django.http import HttpResponseRedirect from django.contrib import auth from django.core.context_processors import csrf from models import * from django.shortcuts import get_object_or_404 from forms import * from django.template.context import RequestContext from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate, login def login(request): c = {} c.update(csrf(request)) return render_to_response('login.html', c) def auth_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: auth.login(request.user) return HttpResponse('/accounts/loggedin') else: return HttpResponse('/accounts/invalid')
我重定向到另一个我不使用{%csrf_token%}的HTML文件。
Theory 要使csrf保护起作用,需要做一些事情(请查看docs):
' django.middleware.csrf.CsrfViewMiddleware'
csrf_protect()
django.core.context_processors.csrf
<input type='hidden' name='csrfmiddlewaretoken' value="jdwjwjefjwdjqwølksqøwkop2j3ofje" />
你应该没事的。
另一方面NOTPROVIDED,如果你看到,则在创建csrf令牌时出现了问题。通过查看源代码(context_processors.py和csrf.py),我们可以发现:
context_processors.py
csrf.py
csrf(request)
{'csrf_token': 'NOTPROVIDED'}
get_token(request)
request.META.get("CSRF_COOKIE", None)
我认为这意味着None如果未成功创建cookie ,它将返回。
Fix 对你来说,这意味着你应该先更换
<form action="/accounts/auth/" method="post" {% csrf_token %}>
与
<form action="/accounts/auth/" method="post"> {% csrf_token %} (...) </form>
我们希望csrf字段位于内部<form>...</form>,而不是内部<form>。由于目前的代码是,它将被转换为
<form>...</form>
<form>
<form action="/accounts/auth/" method="post" <input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />>
我们希望
<form action="/accounts/auth/" method="post"> <input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />
之后-查看源代码,看看是否可以找到csrf字段。如果你能看到它,那么一切都应该在理论上起作用。
你还可以检查浏览器(例如Chrome)中是否设置了csrf cookie,右键单击网页,然后选择Insepect Element。选择Resources选项卡,然后单击cookie。你应该在csrftoken那里找到一个cookie名称。
Insepect Element
Resources
csrftoken
如果仍然有问题,请仔细检查你的中间件元组,settings.py并如上所述检查浏览器是否接受来自服务器的cookier。
settings.py