2017-07-18 43 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用作參考。

相關問題