Flask 核心
问题
Flask 的核心概念有哪些?蓝图、请求上下文、扩展机制怎么用?
答案
基础应用
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/api/users", methods=["GET"])
def get_users():
page = request.args.get("page", 1, type=int)
return jsonify({"users": [], "page": page})
@app.route("/api/users", methods=["POST"])
def create_user():
data = request.get_json()
return jsonify(data), 201
蓝图(Blueprint)
from flask import Blueprint
user_bp = Blueprint("user", __name__, url_prefix="/api/users")
@user_bp.route("/")
def list_users():
return jsonify([])
# 注册蓝图
app.register_blueprint(user_bp)
请求上下文
Flask 使用线程局部变量(werkzeug.local.LocalStack)实现请求上下文:
from flask import request, g, current_app
# request:当前请求对象
# g:请求级别的全局存储(每次请求重置)
# current_app:当前应用实例
@app.before_request
def before():
g.start_time = time.time()
@app.after_request
def after(response):
duration = time.time() - g.start_time
response.headers["X-Duration"] = str(duration)
return response
常见面试问题
Q1: Flask 的请求上下文原理?
答案:
Flask 使用 LocalStack(基于 threading.local)在每个线程中维护独立的请求上下文栈。请求进入时压入 request、g 等对象,请求结束时弹出。这让多线程环境下每个请求互不干扰。
Q2: Flask 和 Django 怎么选?
答案:
- Django:需要 Admin、ORM、认证等开箱即用功能的大型项目
- Flask:微服务、简单 API、需要高度自定义的项目