我想为用户生成一个随机的1次密码,该密码以Django形式显示为禁用字段。
密码将在页面上以表格形式显示给用户,用户将无法对其进行编辑,但它将与表格一起提交。我不想让用户设置自己的密码,但是我想告诉他们他们的密码是什么。
确保用户不编辑为用户生成的1次密码的最佳方法是什么?我一直在使用会话变量来记住该值,以便可以确认它在提交后未被篡改。
def my_page(request):
# If submitted
if request.method == "POST":
# Check to make sure passcode wasn't altered
if (request.POST.get('passcode') == request.session['pw']):
... rest of function here ...
# Generate passcode and store it the session
request.session['pw'] = genRandomPassword()
# Init the form with a passcode
form = MyForm(initial={'passcode': request.session['pw']})
return render(request, 'example.html', {'form': form})
是否有更好的方法来完成我想做的事情?我认为只要用户无法编辑其会话变量,我所做的就可以。如果用户打开另一个选项卡,它的确会中断,因为将生成第二个密码会话变量。
我不想将密码存储在数据库中。
答案 0 :(得分:1)
我认为不用检查request.POST.get('passcode') == request.session['pw']
而是简单地忽略POST
中的数据并使用来自session
的数据,因此,即使用户以某种方式更改了您都不关心的密码(请注意,您甚至不需要在表单中添加pw
,它可以是模板上下文变量)
注意:我个人认为您的解决方案不是一个好主意,请不要在提交前生成密码,让用户填写表单,并在成功提交后生成随机密码,然后向用户提交显示页面以表明您的表单是提交,密码为blah blah
注2:解决方案的问题是假设我打开一个页面,生成的密码为1
,然后打开一个新标签,生成的密码为2
,(现在是{{1} }会以2
的形式存储在会话中,然后我在第一页上填写表格并提交。现在会发生什么?使用示例代码,您必须向用户显示错误,但用户没有出现任何错误,并且使用我的修复程序(第一段),用户认为她的密码是pw
,但实际上是1
>