之前我们接触的视图都是函数,所以⼀般简称视图函数。其实视图也可以基于 类来实现,类视图的好处是⽀持继承,但是类视图不能跟函数视图⼀样,写完 类视图还需要通过app.add_url_rule(url_rule,view_func)来进⾏注册。
标准类视图
标准类视图是继承⾃flask.views.View,并且在子类中必须实现 dispatch_request⽅法,这个⽅法类似于视图函数,也要返回⼀个基于 Response或者其子类的对象
from flask import Flask, views
app = Flask(__name__)
class ListView(views.View):
def dispatch_request(self): # 继承views.View必须重写dispatch_request
return '类视图'
# 添加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, request
app = 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_required
def 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'))