之前我们接触的视图都是函数,所以⼀般简称视图函数。其实视图也可以基于 类来实现,类视图的好处是⽀持继承,但是类视图不能跟函数视图⼀样,写完 类视图还需要通过app.add_url_rule(url_rule,view_func)来进⾏注册。
标准类视图
标准类视图是继承⾃flask.views.View,并且在子类中必须实现 dispatch_request⽅法,这个⽅法类似于视图函数,也要返回⼀个基于 Response或者其子类的对象
from flask import Flask, viewsapp = Flask(__name__)class ListView(views.View):def dispatch_request(self): # 继承views.View必须重写dispatch_requestreturn '类视图'# 添加URL规则app.add_url_rule("/list/", view_func=ListView.as_view('list')) # endpoint和as_view均可给别名
基于调度⽅法的视图
Flask还为我们提供了另外⼀种类视图flask.views.MethodView,对每个HTTP ⽅法执⾏不同的函数(映射到对应⽅法的⼩写的同名⽅法上)
from flask import Flask, render_template, views, requestapp = Flask(__name__)class LoginView(views.MethodView):# 调度方法的视图def get(self, error=None):return render_template("login.html", error=error)def post(self):name = request.form.get("name")password = request.form.get("password")# 验证输入是否正确if name == "ecithy" and password == "123":return "登录成功"else:return self.get("账号密码错误")# 添加URL规则app.add_url_rule("/login/", view_func=LoginView.as_view('login'))
装饰器
⽤类视图的⼀个缺陷就是⽐较难⽤装饰器来装饰,⽐如有时候需要做权限验证的时候
# 登录之后才能访问的装饰器def login_required(func):def wrapper(*args, **kwargs):username = request.args.get("username")if username:return func(*args, **kwargs)else:return "请先登录"return wrapper@app.route("/settings/")@login_requireddef settting():# 在函数中用装饰器return "个人中心设置"class ProfileView(views.View):# 在类中用装饰器decorators = [login_required]def dispatch_request(self):return "个人页面"app.add_url_rule("/profile/", view_func=ProfileView.as_view('profile'))
