一、CBV介绍
1、class-based views, CBVs
通常使用函数视图(function-based views, FBVs)来定义路由和处理逻辑。不过,Flask 也支持基于类的视图(class-based views, CBVs),这可以帮助在需要共享逻辑或管理复杂视图结构时组织代码。
基于类的视图 CBV 的特点
- 组织性:CBV 方式可以更好地组织和重用代码,尤其适用于复杂的视图逻辑。
- 可继承性:可以通过类继承的方式实现逻辑的共享和复用。
- 封装性:通过类的方法封装不同的 HTTP 请求方法(如 GET、POST、PUT 等)逻辑。
2、基本用法
在 Flask 中使用 CBV 的基本方式是通过继承 flask.views.MethodView
。
from flask import Flask, request, jsonify, url_for from flask.views import MethodView app = Flask(__name__) class MyView(MethodView): def get(self): return jsonify({"message": "This is a GET request"}) def post(self): data = request.get_json() print(url_for("my_view")) return jsonify({"message": "This is a POST request", "data": data}) # 注册路由,绑定视图类 app.add_url_rule('/myview', view_func=MyView.as_view('my_view')) if __name__ == '__main__': app.run(debug=True)
补充:
指定方法名称:
在基于类的视图中,HTTP 方法名 get
, post
, delete
应该直接作为方法名。Flask
自动根据请求的 HTTP 方法调用相应的类方法。因此,需要定义 get
, post
, delete
方法,而不是 mesg1
, mesg2
等自定义方法名称。
也可以显式声明 methods
属性, 如果显式声明了,不在声明中的方法将不被允许
class MyView(MethodView): methods = ['get', 'post'] def get(self): return jsonify({"message": "This is a GET request"}) def post(self): data = request.get_json() print(url_for("my_view")) return jsonify({"message": "This is a POST request", "data": data})
3、路由的别名 view_func=MyView.as_view
def post(self): data = request.get_json() print(url_for("my_view")) return jsonify({"message": "This is a POST request", "data": data})
通过url_for反向解析路由,MyView.as_view 括号中的内容my_view 是myview的别名
即myview怎么修改name,都可以通过别名my_view 去解析到
4、cbv加装饰器
# 定义一个简单的认证装饰器 def api_key_required(f): @wraps(f) def decorated_function(*args, **kwargs): if request.headers.get("API-Key") != "my-secret-key": return jsonify({"error": "Unauthorized"}), 401 return f(*args, **kwargs) return decorated_function # 全局装饰器,decorators = [xxx] class MyView(MethodView): decorators = [api_key_required] def get(self): return jsonify({"message": "This is a GET request"}) def post(self): data = request.get_json() return jsonify({"message": "This is a POST request", "data": data}) # 局部装饰 写在类中方法上 class MyView(MethodView): def get(self): return jsonify({"message": "This is a GET request"}) @api_key_required def post(self): data = request.get_json() return jsonify({"message": "This is a POST request", "data": data})
二、
标签:return,get,flask,data,jsonify,request,cbv,写法,view From: https://www.cnblogs.com/dgp-zjz/p/18517361