之前我们接触的视图都是函数,所以⼀般简称视图函数。其实视图也可以基于 类来实现,类视图的好处是⽀持继承,但是类视图不能跟函数视图⼀样,写完 类视图还需要通过app.add_url_rule(url_rule,view_func)来进⾏注册。

标准类视图

标准类视图是继承⾃flask.views.View,并且在子类中必须实现 dispatch_request⽅法,这个⽅法类似于视图函数,也要返回⼀个基于 Response或者其子类的对象

  1. from flask import Flask, views
  2. app = Flask(__name__)
  3. class ListView(views.View):
  4. def dispatch_request(self): # 继承views.View必须重写dispatch_request
  5. return '类视图'
  6. # 添加URL规则
  7. app.add_url_rule("/list/", view_func=ListView.as_view('list')) # endpoint和as_view均可给别名

基于调度⽅法的视图

Flask还为我们提供了另外⼀种类视图flask.views.MethodView,对每个HTTP ⽅法执⾏不同的函数(映射到对应⽅法的⼩写的同名⽅法上)

  1. from flask import Flask, render_template, views, request
  2. app = Flask(__name__)
  3. class LoginView(views.MethodView):
  4. # 调度方法的视图
  5. def get(self, error=None):
  6. return render_template("login.html", error=error)
  7. def post(self):
  8. name = request.form.get("name")
  9. password = request.form.get("password")
  10. # 验证输入是否正确
  11. if name == "ecithy" and password == "123":
  12. return "登录成功"
  13. else:
  14. return self.get("账号密码错误")
  15. # 添加URL规则
  16. app.add_url_rule("/login/", view_func=LoginView.as_view('login'))

装饰器

⽤类视图的⼀个缺陷就是⽐较难⽤装饰器来装饰,⽐如有时候需要做权限验证的时候

  1. # 登录之后才能访问的装饰器
  2. def login_required(func):
  3. def wrapper(*args, **kwargs):
  4. username = request.args.get("username")
  5. if username:
  6. return func(*args, **kwargs)
  7. else:
  8. return "请先登录"
  9. return wrapper
  10. @app.route("/settings/")
  11. @login_required
  12. def settting():
  13. # 在函数中用装饰器
  14. return "个人中心设置"
  15. class ProfileView(views.View):
  16. # 在类中用装饰器
  17. decorators = [login_required]
  18. def dispatch_request(self):
  19. return "个人页面"
  20. app.add_url_rule("/profile/", view_func=ProfileView.as_view('profile'))