这是的情况:如何让Python为每个会话创建一个新的类实例?
我有一个应用程序,其中包括用户登录功能。
我的问题是这样的:
当/用户登录失败的尝试登录并创建一个用户对象。对于一个用户,它符合以下预期行为:
- 转到页面,但未登录EXPECT重定向到登录页面。
- 不正确的登录信息不是第5次尝试或超出预期重定向到登录页面。
- 给定第5次或以后的错误登录信息,预期重定向到来自任何尝试的路由的致命登录错误消息,不会再尝试接受登录尝试。给出的处置内容
- 正确的登录信息,所有路由
我试图解决的是,当一个用户登录,这是所有用户会话的上下文中解释,而不是问题可见该用户创建的会话。一旦一个用户登录,所有尝试访问该应用的用户都将被授予访问权限,直到该用户注销为止,而不需要后续用户输入密码。
所以我有这样的类,它用作用户对象:
class User:
def __init__(self,password,user_name)
self.password = some_password_hashing_method(password)
self.username = user_name
self.loggedin = False
self.passwordguesses = 0
这是评价一个登录请求的功能。它将从检查是否存在用户对象开始(应该以会话为基础),如果不存在,它会根据登录请求实例化对象,并通过散列算法将值与哈希密码列表进行比较用过的。
它适用于一个用户,但问题是当一个用户登录时,另一个用户从另一台具有不同IP地址的计算机输入应用程序,它不会创建新的用户对象。它会看到现有的user.loggedin设置为True,并且会将用户当作他们未登录的用户,另一个用户登录。
如何使Python将此变量视为每次创建新用户会话时将会生成一次实例变量?
@app.route('/verifylogin',methods = ['POST'])
def verifylogin():
checksPassword = g.readcsv('filewithpasswords.csv')
usersList = g.readcsv('filelistingusers.csv')
global user
try:
the_user.passwordguesses
except NameError:
user = User(request.form['userid'],request.form['password'])
i = 0
if user.password_guesses < 5:
while i < len(checksPassword):
if somehashcheckingmethod(checksPassword[i][0], request.form['password']) and usersList[i][0] == request.form['userid']:
user.loggedin = True
return redirect('/index')
i += 1
user.passwordguesses += 1
return redirect('/login')
else:
return render_template('fatal.html')
最后,这里是它包含所有页面的开始重定向头。预期的行为是:1.检查该用户是否有活动的用户会话,如果没有,则将它们重定向到登录路由。 2.它会检查当前用户是否登录,如果没有,他们也会重定向到登录页面。 3.如果这两个都不是真的,它将转到后续的代码行并提供对内容的访问。
try:
user.isloggedin
except NameError:
return redirect('login')
if user.isloggedin != True:
return redirect('login')
再次,显然有与此代码被解释在上下文中的问题,因为它是应用登录一个用户的登陆状态所有后续用户会话。
请注意,注释掉下面的行不解决此问题:一旦被注释掉
global user
,这改变了用户对象的范围,只有功能verifylogin的范围内( )其中它被宣布。
所以,如果我写了一个新的路由功能来呈现它的内容,现在的对象“用户”是我写来呈现新的路线内容的功能范围之外:
@app.route('/index.html')
def index():
try:
user.isloggedin
except NameError:
return redirect('login')
if user.isloggedin != True: # this code and all code below it is unreachable, because you will always get a NameError exception from the above lines of code. This is not a duplicate.
return redirect('login')
return render_template('index.html')