Flask 默认最自然的是函数视图。
但如果你开始发现很多路由都围绕同一种资源展开,比如:
GET /missions/POST /missions/GET /missions/<id>DELETE /missions/<id>
那 MethodView 会非常顺手。
from flask import request, jsonify
from flask.views import MethodView
MISSIONS = {
1: {"id": 1, "name": "巡逻东门"},
}
class MissionAPI(MethodView):
def get(self, mission_id=None):
if mission_id is None:
return jsonify(list(MISSIONS.values()))
mission = MISSIONS.get(mission_id)
if mission is None:
return {"error": "not found"}, 404
return jsonify(mission)
def post(self):
data = request.get_json() or {}
mission_id = max(MISSIONS) + 1
MISSIONS[mission_id] = {"id": mission_id, "name": data["name"]}
return jsonify(MISSIONS[mission_id]), 201
def delete(self, mission_id):
if mission_id not in MISSIONS:
return {"error": "not found"}, 404
MISSIONS.pop(mission_id)
return "", 204注册方式:
mission_view = MissionAPI.as_view("missions_api")
app.add_url_rule("/missions/", defaults={"mission_id": None}, view_func=mission_view, methods=["GET"])
app.add_url_rule("/missions/", view_func=mission_view, methods=["POST"])
app.add_url_rule("/missions/<int:mission_id>", view_func=mission_view, methods=["GET", "DELETE"])什么时候用它?
- 资源型 API 明显
- 同一资源多个 HTTP 方法逻辑相近
- 想把“这类窗口”封成可复用类
什么时候不用?
- 只是普通业务页面
- 函数视图已经足够清楚
- 团队对类视图不熟,反而会把复杂度抬高
经验上:
Flask 不是非要你上类视图。
函数视图一直是第一公民。
MethodView 是“资源型哨站很多时”的战术装备。