2016-11-15 161 views
1

我正在为我的学校编写一个注册网站,并使用Django作为框架。对于注册,我需要用户名,密码和注册令牌。那些尚未验证,我现在试图做的是从注册输入页面(使用POST请求)到“您已成功注册”页面。沿线的某处,csrf标记显然拒绝被验证。Django 403 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,但我不完全确定它会在哪里使用。

+1

csrf上的1.10文档提到您正在使用的渲染函数(假设它是导入的django的渲染)应该覆盖RequestContext。你到目前为止显示的代码看起来很好。这可能是中间件设置,网站设置中的另一个问题,但不是您发布的代码中看起来不错。 另一方面,当您直接使用浏览器发送GET请求的URL时,该浏览器与CSRF实际上并不相关。在成功的表单处理之后,可能需要考虑单独的成功视图并执行HttpResponseRedirect。 –

回答

0

得到它的工作。丹尼尔是对的 - 这是我的中间件配置问题。我在settings.py中的中间件数组之前添加了两行,并且突然它工作。

SESSION_COOKIE_SECURE = True 
SESSION_EXPIRE_AT_BROWSER_CLOSE = True 

我不能说我完全知道为什么它的工作,或者问题是究竟是什么,但现在的工作。谢谢丹尼尔!

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/
对于我来说,做工精细,但不是最好的,因为多了一行。

相关问题