爲什麼需要Flask擴展?¶
Flask是一個輕量級的Python Web框架,它本身只提供了最基礎的功能,比如路由、模板渲染等。當我們需要更復雜的功能,比如連接數據庫、處理用戶認證、實現表單驗證等,就需要藉助擴展(Extensions) 來完成。這些擴展由社區開發,封裝了常用的功能,讓我們不需要從零開始編寫代碼,能更快地構建應用。
Flask-SQLAlchemy:簡化數據庫操作¶
在Web應用中,數據存儲是核心功能之一。Flask-SQLAlchemy是一個將SQLAlchemy(一個強大的ORM庫)集成到Flask中的擴展,它讓我們可以用Python對象的方式操作數據庫,而不用直接編寫SQL語句。
安裝¶
pip install flask-sqlalchemy
基本配置¶
在Flask應用中初始化SQLAlchemy,並配置數據庫:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 配置數據庫URI(這裏用SQLite,適合開發測試)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
# 關閉SQLAlchemy的修改跟蹤功能(減少資源消耗)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化SQLAlchemy實例
db = SQLAlchemy(app)
定義數據模型¶
以用戶認證爲例,創建一個User模型存儲用戶信息:
class User(db.Model):
__tablename__ = 'users' # 表名
id = db.Column(db.Integer, primary_key=True) # 主鍵
username = db.Column(db.String(80), unique=True, nullable=False) # 用戶名
password_hash = db.Column(db.String(128), nullable=False) # 加密後的密碼
數據庫操作¶
- 創建表:在應用啓動時執行
db.create_all()創建所有表(需在with app.app_context():中運行):
with app.app_context():
db.create_all() # 創建數據庫表
- 添加用戶:
new_user = User(username='testuser', password_hash='hashed_password')
db.session.add(new_user) # 添加到會話
db.session.commit() # 提交事務,保存到數據庫
- 查詢用戶:
user = User.query.filter_by(username='testuser').first() # 查詢用戶名匹配的用戶
if user:
print(f"找到用戶:{user.username}")
- 更新/刪除用戶:
# 更新
user = User.query.get(1)
user.username = 'newusername'
db.session.commit()
# 刪除
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
用戶認證:Flask-Login與安全存儲¶
用戶認證的核心是驗證身份和保持登錄狀態。Flask-Login是一個專門處理用戶會話、登錄狀態管理的擴展,配合數據庫存儲用戶信息,就能快速實現登錄、登出功能。
安裝Flask-Login¶
pip install flask-login
配置Flask-Login¶
初始化LoginManager並設置用戶加載函數:
from flask_login import LoginManager, login_user, login_required, logout_user, current_user
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login' # 未登錄時跳轉的登錄頁面路由
# 用戶加載函數:根據用戶ID查詢用戶(必須實現)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id)) # 通過ID查詢用戶
密碼安全存儲¶
密碼絕對不能明文存儲!使用Werkzeug的generate_password_hash和check_password_hash加密:
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model):
# 新增密碼加密方法
def set_password(self, password):
self.password_hash = generate_password_hash(password) # 加密密碼
def check_password(self, password):
return check_password_hash(self.password_hash, password) # 驗證密碼
登錄與登出功能¶
- 登錄視圖:驗證用戶並保持會話:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
login_user(user) # 登錄成功,維護會話
return redirect(url_for('dashboard'))
else:
return "用戶名或密碼錯誤"
# GET請求:顯示登錄表單
return '''
<form method="POST">
<input type="text" name="username" placeholder="用戶名"><br>
<input type="password" name="password" placeholder="密碼"><br>
<button type="submit">登錄</button>
</form>
'''
- 登出視圖:
@app.route('/logout')
@login_required # 僅登錄用戶可訪問
def logout():
logout_user() # 登出用戶,清除會話
return redirect(url_for('index'))
保護路由¶
用@login_required裝飾器保護需要登錄的頁面:
@app.route('/dashboard')
@login_required
def dashboard():
return f"歡迎,{current_user.username}!" # current_user是當前登錄用戶
總結¶
通過Flask-SQLAlchemy和Flask-Login這兩個擴展,我們可以快速實現一個帶有數據庫和用戶認證的Web應用:
- Flask-SQLAlchemy:通過Python對象操作數據庫,無需寫SQL,簡化數據增刪改查。
- Flask-Login:處理用戶會話、登錄狀態,配合密碼加密,實現安全的登錄/登出功能。
初學者只需掌握基礎的安裝、配置和核心API(如db.create_all()、login_user()、logout_user()),就能快速構建用戶系統。生產環境中還需考慮HTTPS、CSRF防護等安全問題,後續可學習Flask-WTF(表單驗證)、Flask-Security等擴展完善應用。