Django 403 CSRF验证失败

时间:2016-11-15 17:29:22

标签: python django csrf

我正在为我的学校编写一个注册网站,并使用Django作为框架。对于注册,我需要用户名,密码和注册令牌。那些尚未经过验证的,我现在尝试做的就是从注册输入页面(使用POST请求)转到"您已成功注册"页。沿着这条线的某个地方,csrf令牌显然拒绝被验证。

我的观点:

def register(request):
    return render(request, 'enroller/successfulEnroll.html')

我的页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="{% url 'register' %}" method="post"> {% csrf_token %}
    <div class="container">
        <label><b>New Username</b></label>
        <input type="text" placeholder="Username" name="uname" required>
        <br>
        <label><b>Password</b></label>
        <input type="password" placeholder="Password" name="psw" required>
        <br>
        <label><b>Registration Password</b></label>
        <input type="text" placeholder="Registration Key" name="reg" required>
        <br>
        <input type="submit" value="Register" />
    </div>
    </form>
</body>
</html>

当我尝试从注册页面转到成功页面时,它给出了错误403(CSRF验证失败。请求中止)。但是,当我尝试访问url mysite.com/register/时,它会返回我请求的页面而没有错误。

有什么方法可以解决这个问题吗?我一直在关注RequestContext,但我并不完全确定它将在何处使用。

2 个答案:

答案 0 :(得分:0)

让它发挥作用。 Daniel是对的 - 这是我的中间件配置的问题。我在settings.py中的中间件数组之前添加了两行,突然之间就可以了。

SESSION_COOKIE_SECURE = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

我不能说我完全确定它为什么有用,或者问题究竟是什么,但它现在有效。谢谢丹尼尔!

答案 1 :(得分:0)

也许你可以使用这种方法。而djang版本是1.11.1

from django.shortcuts import render
from django.template.context_processors import csrf

form = LoginForm()
c = {'form': form}
c.update(csrf(request))
return render(request, 'a_template.html', c)

我在http://djangobook.com/security-in-django/找到了此方法
对我来说,工作正常,但不是最好的,因为不仅仅是一条线。