我正在尝试登录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文件。
答案 0 :(得分:20)
要使csrf保护工作,需要做几件事(查看docs):
django.middleware.csrf.CsrfViewMiddleware'
中包含'settings.py
作为中间件(或者在要保护的特定视图上使用装饰器csrf_protect())django.core.context_processors.csrf
传递给上下文管理器。加载页面时,请使用您喜欢的浏览器查看页面源代码。不要打开模板html文件,打开指向包含表单的视图的url。看看你放置{% csrf_token %}
的位置。如果你看到像
<input type='hidden' name='csrfmiddlewaretoken' value="jdwjwjefjwdjqwølksqøwkop2j3ofje" />
你应该没问题。
另一方面,如果您看到NOTPROVIDED
,则在创建csrf令牌时出现问题。通过查看源代码(context_processors.py
和csrf.py
),我们可以找到以下内容:
csrf(request)
返回None,则{'csrf_token': 'NOTPROVIDED'}
会返回get_token(request)
。 get_token(request)
返回request.META.get("CSRF_COOKIE", None)
。 我认为这意味着如果未成功创建cookie,它将返回None
。
对你来说,这意味着你应该先替换
<form action="/accounts/auth/" method="post" {% csrf_token %}>
与
<form action="/accounts/auth/" method="post">
{% csrf_token %}
(...)
</form>
我们希望csrf字段在<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字段。如果你能看到它,一切都应该在理论上有效。
您还可以检查是否已在浏览器中设置了csrf Cookie,例如在Chrome中,右键单击该网页,然后选择Insepect Element
。选择Resources
标签,然后点击Cookie。你应该在那里找到一个cookie名称csrftoken
。
如果您仍然遇到问题,请仔细检查settings.py
中的中间件元组,然后仔细检查您的浏览器是否接受了服务器中的cookier,如上所述。
答案 1 :(得分:2)
清除浏览器缓存,然后重试。也许它正在使用缓存cookie中保存的CSRF令牌。
答案 2 :(得分:-3)
添加上述答案后,请尝试在视图中添加以下行
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def somathing():
return something