我正在app.py為我的燒瓶應用程式重構我的。我試圖讓一個user.py類處理所有與用戶相關的事情。user.py如果我的資料庫中不存在該用戶,我應該如何構造我的類以回傳 false?
應用程式.py:
db = get_db_connection()
user = User(db, request.form.get("email"))
if not user.get_email(): # If user does not exist send user to registration page
return redirect("/register", email=request.form.get("email")) # go to the registration page and fill in the used e-mail address
# Check password and send to user_index if correct
password = request.form.get('password')
if user.check_password(password):
session['userID'] = user.get_id()
session['name'] = user.get_first_name()
session['email'] = user.get_email()
return redirect("/user_index")
return message("Wrong Password. Go to log in page to try again.")
用戶.py:
class User:
def __init__(self, database, email):
db = database
user = db.execute("SELECT * FROM users WHERE users.email = ?", [email]).fetchall()
if user:
self.__id = user['id']
self.__last_name = user['lastName']
self.__first_name = user['firstName']
self.__email = user['email']
self.__date_of_birth = user['dateOfBirth']
self.__hash = user['hash']
我知道當我在 python 中實體化一個物件時,它應該不回傳任何內容。如何構建我的代碼,以便如果具有給定電子郵件的用戶不存在,我可以獲得某種型別的錯誤值?一旦我得到一個錯誤的值,我應該能夠將用戶重定向到注冊頁面。
如果我這樣做完全錯誤,請指出我正確的方向。
uj5u.com熱心網友回復:
這里有很多東西要提:
- 我建議將 SQLAlchemy 之類的 ORM 與 Flask 一起使用。它會讓你的生活變得更輕松,而且你不必擔心一些安全問題(例如 SQL 注入)。
- 如果用戶要登錄,如果他們的電子郵件或密碼不正確,最好回傳“錯誤憑據”訊息,這樣攻擊者將不知道哪個是正確的或不正確的,因此他們會有很多很多更多組合嘗試。也就是說,只需將短語“錯誤密碼”更改為“錯誤憑據”,您將覆寫應用程式中的安全漏洞。如果用戶未注冊,則應回傳相同的訊息。
- 我建議閱讀Python 中下劃線的用法,因為您顯然是在不需要它的地方使用它。
- 在 Python 中,您不需要使用 getter 和 setter,除非您需要在獲取或設定屬性之前進行一些預處理。
最后,在 Flask 中,這是構建小專案的常用方法:
__init__.py
from flask import Flask
from utils import get_db_connection
app = Flask(__name__)
db = get_db_connection()
實用程式.py
# Do the necessary imports.
def get_db_connection():
...
運行.py
from . import app
if __name__ == "__main__":
app.run() # You can set multiple settings in run().
路線.py
from . import app
from user import User
@app.route("/login", methods=["POST"])
def login():
user = User.get(request.form.get("email"))
# This is not recommended.
# if not user:
# return redirect("/register", email=request.form.get("email"))
password = request.form.get('password')
if user and user.check_password(password):
session['userID'] = user.id
session['name'] = user.first_name
session['email'] = user.email
return redirect("/user_index")
return message("Wrong credentials. Go to log in page to try again.")
模型.py
from . import db
class User:
def __init__(self, id, last_name, first_name, email, date_of_birth, hash):
self.id = id
self.last_name = last_name
self.first_name = first_name
self.email = email
self.date_of_birth = date_of_birth
self.hash = hash
def check_password(self, password):
return check_password_hash(self.hash, password)
@staticmethod
def get(email):
user_result = db.execute("SELECT * FROM users WHERE users.email = ?", [email]).fetchall()
if user_result:
return User(user_result['id'], user_result['lastName'], user_result['firstName'],
user_result['email'], user_result['dateOfBirth'], user_result['hash'])
return None
# Declare more classes for your database models!
# class Admin:
#
# ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/433482.html
