from flask import Flask, request, jsonify, session
import os
app = Flask(__name__)
app.secret_key = os.urandom(24)
users = {
'123': 'admin',
'admin': 'admin'
}
# 登錄接口
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if username in users and users[username] == password:
session['logged_in'] = True
return 'Login successful', 200
else:
return 'Login failed', 401
這段代碼是一個簡單的 ?Flask? 后端應用,實現了一個用戶登錄功能,并使用 ?Session? 來管理用戶登錄狀態。以下是代碼的詳細解釋:
?1. 導入必要的模塊?
from flask import Flask, request, jsonify, session
import os
- ?**
Flask
**?:Flask 框架的核心類,用于創建 Web 應用。 - ?**
request
**?:用于處理 HTTP 請求(如獲取 POST 數據)。 - ?**
jsonify
**?:用于返回 JSON 格式的響應(雖然代碼中沒有直接使用)。 - ?**
session
**?:用于管理用戶會話(Session),存儲登錄狀態等信息。 - ?**
os
**?:用于生成安全的隨機密鑰。
?2. 創建 Flask 應用?
app = Flask(__name__)
app.secret_key = os.urandom(24) # 設置一個密鑰,用于加密 session 數據
- ?**
app = Flask(__name__)
**?:創建一個 Flask 應用實例。 - ?**
app.secret_key = os.urandom(24)
**?:- ?**
secret_key
**? 是 Flask 用來加密 Session 數據的密鑰。 - ?**
os.urandom(24)
**? 生成一個 24 字節的隨機密鑰,確保 Session 數據的安全性。
- ?**
?3. 模擬用戶數據?
users = {'123': 'admin','admin': 'admin'
}
- 這是一個簡單的字典,存儲用戶名和密碼(實際項目中應該使用數據庫)。
- 示例用戶:
- 用戶名?
123
,密碼?admin
- 用戶名?
admin
,密碼?admin
- 用戶名?
?4. 登錄接口?/login
@app.route('/login', methods=['POST'])
def login():data = request.get_json() # 獲取 POST 請求的 JSON 數據username = data.get('username') # 獲取用戶名password = data.get('password') # 獲取密碼if username in users and users[username] == password:session['logged_in'] = True # 登錄成功,設置 Sessionreturn 'Login successful', 200 # 返回成功消息else:return 'Login failed', 401 # 返回失敗消息
?功能解析?
- ?**
@app.route('/login', methods=['POST'])
**?:- 定義了一個 ?POST? 請求的路由?
/login
,用于處理登錄請求。
- 定義了一個 ?POST? 請求的路由?
- ?**
data = request.get_json()
**?:- 獲取客戶端發送的 ?JSON 數據?(如?
{"username": "hami", "password": "admin"}
)。
- 獲取客戶端發送的 ?JSON 數據?(如?
- ?**
username = data.get('username')
? 和 ?password = data.get('password')
**?:- 從 JSON 數據中提取?
username
?和?password
。
- 從 JSON 數據中提取?
- ?驗證用戶?
- 檢查?
username
?是否在?users
?字典中,并且密碼是否匹配。 - 如果匹配:
- ?**
session['logged_in'] = True
**?:設置 Session,標記用戶已登錄。 - ?**
return 'Login successful', 200
**?:返回成功消息(HTTP 200)。
- ?**
- 如果不匹配:
- ?**
return 'Login failed', 401
**?:返回失敗消息(HTTP 401 未授權)。
- ?**
- 檢查?
?5. Session 的作用?
- ?**
session['logged_in'] = True
**?:- 在用戶登錄成功后,Flask 會存儲一個加密的 Session Cookie 在客戶端(瀏覽器)。
- 后續請求會自動攜帶這個 Cookie,服務器可以檢查?
session['logged_in']
?來判斷用戶是否登錄。
- ?**
secret_key
**? 的作用:- 確保 Session 數據不會被篡改(因為數據是加密的)。
?6. 如何測試這個 API???
可以使用 ?Postman? 或 ?curl? 發送 POST 請求:
curl -X POST http://127.0.0.1:5000/login \-H "Content-Type: application/json" \-d '{"username": "hami", "password": "admin"}'
?成功響應:??
Login successful
?失敗響應:??
Login failed
?7. 可能的改進?
- ?使用數據庫存儲用戶?(如 SQLite、MySQL)。
- ?密碼加密存儲?(如?
bcrypt
?或?hashlib
)。 - ?添加注銷功能?(
session.pop('logged_in', None)
)。 - ?返回 JSON 格式的響應?(如?
jsonify({"message": "Login successful"})
)。
?總結?
- 這是一個簡單的 ?Flask 登錄 API,使用 ?Session? 管理登錄狀態。
- 適用于小型應用或學習 Flask 的 Session 機制。
- 實際項目中需要更安全的用戶管理和數據庫支持。
?