2017-07-18 126 views
0

这是的情况:如何让Python为每个会话创建一个新的类实例?

我有一个应用程序,其中包括用户登录功能。

我的问题是这样的:

当/用户登录失败的尝试登录并创建一个用户对象。对于一个用户,它符合以下预期行为:

  1. 转到页面,但未登录EXPECT重定向到登录页面。
  2. 不正确的登录信息不是第5次尝试或超出预期重定向到登录页面。
  3. 给定第5次或以后的错误登录信息,预期重定向到来自任何尝试的路由的致命登录错误消息,不会再尝试接受登录尝试。给出的处置内容
  4. 正确的登录信息,所有路由

我试图解决的是,当一个用户登录,这是所有用户会话的上下文中解释,而不是问题可见该用户创建的会话。一旦一个用户登录,所有尝试访问该应用的用户都将被授予访问权限,直到该用户注销为止,而不需要后续用户输入密码。

所以我有这样的类,它用作用户对象:

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') 

回答

0

这通常通过使用通过secure cookies递送的sessions在网络中完成。

https://blog.miguelgrinberg.com/post/how-secure-is-the-flask-user-session

会话是安全的(希望)的cookie,你的应用程序将提供每个客户端。您的应用程序应该能够生成持续的单个会话,持续时间只要会话处于活动状态。对于许多流行的Web框架,cookie包含的唯一内容是会话ID。通过这种方式,您可以为用户存储持久状态,并将其会话ID用作参考。

相关问题