Flask 类视图 API
Flask 提供了两种类视图,让你用面向对象的方式组织视图逻辑。
View 是最基础的类视图,MethodView 按 HTTP 方法自动分发。
View 基类
| 属性/方法 | 说明 |
|---|---|
| methods | 类属性,视图接受的 HTTP 方法列表。默认 None(使用 add_url_rule 的默认值) |
| decorators | 类属性,装饰器列表。按顺序应用到生成的视图函数 |
| init_every_request | 类属性,bool。True(默认)时每个请求创建新实例,False 时复用单实例 |
| provide_automatic_options | 类属性,是否自动实现 OPTIONS。默认 None(使用应用配置) |
| dispatch_request(**kwargs) | 核心方法,必须被重写。kwargs 为 URL 变量 |
| as_view(name, *class_args, **class_kwargs) | 类方法,创建可在 add_url_rule 中使用的视图函数 |
MethodView 类
继承自 View,按 HTTP 方法自动分发到对应实例方法。
| 方法命名规则 | 说明 |
|---|---|
| get(self, **kwargs) | 处理 GET 请求 |
| post(self, **kwargs) | 处理 POST 请求 |
| put(self, **kwargs) | 处理 PUT 请求 |
| delete(self, **kwargs) | 处理 DELETE 请求 |
| patch(self, **kwargs) | 处理 PATCH 请求 |
定义这些方法后,methods 属性会自动根据已定义的方法设置。
View vs MethodView
| 特性 | View | MethodView |
|---|---|---|
| 分发方式 | 单一 dispatch_request 处理所有方法 | 按方法名自动分发(get→GET 等) |
| 适用场景 | 通用视图、模板渲染 | RESTful API |
代码示例
实例
from flask import Flask, request, session, redirect, url_for
from flask.views import View, MethodView
app = Flask(__name__)
# 基础 View:单一的 dispatch_request
class HelloView(View):
def dispatch_request(self, name):
return f"<h1>Hello, {name}!</h1>"
app.add_url_rule("/hello/<name>", view_func=HelloView.as_view("hello"))
# MethodView:RESTful API
class PostAPI(MethodView):
# 自定义初始化(每次请求都会调用)
def __init__(self):
self.db = get_database_connection()
def get(self, post_id=None):
if post_id is None:
posts = self.db.query_all_posts()
return {"posts": posts}
return self.db.get_post(post_id)
def post(self):
data = request.json
post_id = self.db.create_post(data["title"], data["body"])
return {"id": post_id}, 201
def delete(self, post_id):
self.db.delete_post(post_id)
return {"message": "deleted"}
# 注册:同一视图函数处理多个方法
post_view = PostAPI.as_view("post_api")
app.add_url_rule("/api/posts", defaults={"post_id": None},
view_func=post_view, methods=["GET", "POST"])
app.add_url_rule("/api/posts/<int:post_id>",
view_func=post_view, methods=["GET", "DELETE"])
from flask.views import View, MethodView
app = Flask(__name__)
# 基础 View:单一的 dispatch_request
class HelloView(View):
def dispatch_request(self, name):
return f"<h1>Hello, {name}!</h1>"
app.add_url_rule("/hello/<name>", view_func=HelloView.as_view("hello"))
# MethodView:RESTful API
class PostAPI(MethodView):
# 自定义初始化(每次请求都会调用)
def __init__(self):
self.db = get_database_connection()
def get(self, post_id=None):
if post_id is None:
posts = self.db.query_all_posts()
return {"posts": posts}
return self.db.get_post(post_id)
def post(self):
data = request.json
post_id = self.db.create_post(data["title"], data["body"])
return {"id": post_id}, 201
def delete(self, post_id):
self.db.delete_post(post_id)
return {"message": "deleted"}
# 注册:同一视图函数处理多个方法
post_view = PostAPI.as_view("post_api")
app.add_url_rule("/api/posts", defaults={"post_id": None},
view_func=post_view, methods=["GET", "POST"])
app.add_url_rule("/api/posts/<int:post_id>",
view_func=post_view, methods=["GET", "DELETE"])
