Flask 本身不直接操作數據庫,而是通過擴展(如 Flask-SQLAlchemy、PyMySQL)實現。前端數據傳遞到後端主要有三種方式:URL 參數、表單提交、JSON 請求體。
pip install flask flask-sqlalchemy pymysql
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# MySQL 連接 URI 格式:mysql+pymysql://用戶:密碼@主機:端口/數據庫
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'mysql+pymysql://root:password@localhost:3306/mydb')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
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)
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('/user')
def get_user():
username = request.args.get('username') # 獲取 ?username=xxx
user = User.query.filter_by(username=username).first()
return jsonify({'exists': user is not None})
@app.route('/register', methods=['POST'])
def register():
username = request.form.get('username')
password = request.form.get('password')
if not username or not password:
return jsonify({'error': '參數缺失'}), 400
if User.query.filter_by(username=username).first():
return jsonify({'error': '用戶已存在'}), 409
user = User(username=username)
user.set_password(password)
db.session.add(user)
db.session.commit()
return jsonify({'message': '註冊成功'}), 201
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
if not data:
return jsonify({'error': '請求體必須為 JSON'}), 400
username = data.get('username')
password = data.get('password')
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
return jsonify({'token': 'fake-jwt-token'})
return jsonify({'error': '認證失敗'}), 401
// 註冊
fetch('/register', {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: new URLSearchParams({username: 'test', password: '123456'})
}).then(r => r.json()).then(console.log);
// 登錄
fetch('/login', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({username: 'test', password: '123456'})
}).then(r => r.json()).then(console.log);
generate_password_hash/check_password_hash。