全书目录

第二十九篇:Flask 完全指南 —— 轻骑兵微服务街区宇宙

第十三章:类视图和 `MethodView` —— 当你的哨站越来越像 REST 资源时

1 分钟 305 字 第 530 / 962 个阅读单元

Flask 默认最自然的是函数视图。

但如果你开始发现很多路由都围绕同一种资源展开,比如:

  • GET /missions/
  • POST /missions/
  • GET /missions/<id>
  • DELETE /missions/<id>

MethodView 会非常顺手。

py
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

注册方式:

py
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 是“资源型哨站很多时”的战术装备。