如何基于另一个视图的结果来消除Django视图

时间:2017-01-19 01:45:03

标签: django django-forms

我正在为我的Django应用编写change password功能,允许用户随意更改密码。一个要求是用户必须在继续更改之前重新提交原始密码。

负责reauth of original passwordenter new password的视图会映射到两个单独的网址。目前它的设置方式,只需点击正确的网址即可直接进入功能的enter new password部分。我需要强制reauth of original password,因此当前的功能是不可接受的。

重新设计此功能的最佳策略是什么,以便重置密码在reauth要求后面?我想到的一件事是在成功的reauth时将标志设置为会话变量,并且只有在正确设置了所述标志的情况下才允许密码重置。但我希望能有更强大的方式吗?

我目前的代码是:

def reset_password(request,*args,**kwargs):
    if request.method == 'POST':
        form = ResetPasswordForm(data=request.POST,request=request)
        if form.is_valid():
            #save new password hash
        else:
            context={'form':form}
            return render(request,'reset_password.html',context)    
    else:
        form = ResetPasswordForm()
        context={'form':form}
        return render(request,'reset_password.html',context)

def reauth(request, *args, **kwargs):
    if request.method == 'POST':
        form = ReauthForm(data=request.POST,request=request)
        if form.is_valid():
            return redirect("reset_password")
        else:
            context={'form':form}
            return render(request, 'reauth.html', context)
    else:
        form = ReauthForm()
        context = {'form':form}
        return render(request, 'reauth.html', context)

1 个答案:

答案 0 :(得分:0)

我不知道这是否是最好的方法,我想强调我不知道这种方法有多安全,但这可以通过会话来完成。

这是一个例子,

@csrf_exempt
def render_first_page(request):
    if request.method == 'POST':
        request.session['first'] = True
        print (request.session['first'])
        return redirect('/second/')
    try:
        del request.session['first']
    except KeyError:
        pass

    return HttpResponse("<form method='POST'><input type='text' name='test'/><input type='submit'/></form>")

def render_second_page(request):

    try:
        if request.session['first'] == True:
            return HttpResponse("Welcome to Second Page")
    except KeyError:
        print ("No first")
        return redirect('/first/')

要开始,如果第一个键是第一个&#39;在会话变量中不存在,并将重定向到第一页。

在我收到POST请求的第一页上,会话对象上创建了一个令牌,随后,我们被重定向到第二页,现在令牌存在,第二页被呈现。

请务必在适当的时候删除会话密钥。我建议在渲染第二页时删除令牌。