這是的情況:如何讓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')