【发布时间】:2017-03-29 16:56:34
【问题描述】:
我正在为我的学校编写一个招生网站,并使用 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,但我不完全确定它会在哪里使用。
【问题讨论】:
-
csrf 上的 1.10 文档提到您正在使用的渲染函数(假设它是导入的 django 渲染)应该涵盖 RequestContext。到目前为止,您显示的代码看起来不错。这可能是中间件设置、站点设置中的另一个问题,但不是您发布的看起来不错的代码。顺便说一句,当您使用浏览器直接访问 GET 请求的 url 时,CSRF 并不真正相关。可能值得考虑在成功处理表单后使用单独的成功视图并执行 HttpResponseRedirect。