头图

本文首发于公众号:Hunter后端

原文链接:Flask笔记七之基于类的视图

前面我们提供 API 接口,都是通过 @app.route() 或者使用 Blueprint@bp.route() 的方式来定义接口。

现在这里介绍一下使用视图类的方式来提供接口。

视图类的方式和 Django 中的 View 使用的方式类似,接下来我们将之前的 /user/register 接口改写成视图类的方式。

本篇笔记的代码都已经提交到 github 上,可使用下面的操作获取代码:

git clone https://github.com/x1204604036/flask_backend.git

1、url 注册

如果我们之前的接口是用的 @app.route 的方式,那么这里注册的方式就是 app.add_url_rule()

如果是用的 Blueprint 来定义接口的,那么这里注册的方式就是 bp.add_url_rule()

其方式如下:

bp.add_url_rule("/register", view_func=UserRegisterView.as_view("register"))

其中,UserRegisterView 是我们编写的基于类的视图,文件内容如下:

# app/user/bp_user.py

from flask import Blueprint, request, session, jsonify
from werkzeug.security import generate_password_hash, check_password_hash
from app.models.user import User
from .views import UserRegisterView


bp = Blueprint("user", __name__, url_prefix="/user")

bp.add_url_rule("/register", view_func=UserRegisterView.as_view("register"))

接下来我们去创建类视图

2、flask.views.View

类视图处理接口逻辑有两种,一种是 flask.views.View,一种是 flask.views.MethodView,这里先介绍前者。

我们在 app/user/ 文件夹下创建一个 views.py 文件,文件内容如下:

# app/user/views.py

from flask.views import View


class UserRegisterView(View):
    methods = ["POST"]

    def dispatch_request(self):
        # do something
        return {"code": 0, "msg": "注册成功"}

对于 View 这个类,其下的 dispatch_request() 函数等同于视图函数,我们只需要把之前使用 @bp.route() 里的函数逻辑拷贝过来即可

我们可以在 dispatch_request() 里根据 request.method 来判断请求方式,然后进行不同的处理,当然,我们这个在前面的 methods 里定义了这个类允许调用的请求方式,所以不用对请求方法进行判断。

3、flask.views.MethodView

前面的类继承的是 View,我们也可以继承 MethodView 来处理请求

使用 MethodView 有个好处就是,我们可以直接在类里根据不同的请求方式来调用不同的函数,比如 GET 请求,就会直接调用下面的 get() 方法,示例如下:

class UserRegisterView(MethodView):
    methods = ["GET", "POST"]

    def get(self):
        return {"msg": "GET method OK "}

    def post(self):
        result = {"code": 0, "msg": "注册成功"}
        return result

至于基于视图函数和视图类的两种方式处理接口选择哪种,就我个人而言,之前使用 Django 的方式可能习惯了,所以看起来 url 和 views 两者分开的逻辑对我来说在逻辑架构上是更清晰的,所以我个人是更倾向于视图类的使用的。

以上就是基于类的视图的介绍。

如果想获取更多后端相关文章,可扫码关注阅读:


Hunter
27 声望12 粉丝