可插拨视图基于类实现视图,其灵感来自于 Django 的 CBV(基于类的视图)。
一、基本原理
假设有一个函数用于从数据库中载入一个对象列表并在模板中渲染:
@app.route('/users/')
def show_users(page):
users = User.query.all() # 通过 ORM 加载数据
return render_template('users.html', users=users)
写成可插拨视图:
from flask.views import View
class ShowUsers(View):
def dispatch_request(self):
users = User.query.all()
return render_template('users.html', objects=users)
app.add_url_rule('/users/', view_func=ShowUsers.as_view('show_users'))
我们要做的是:
- 创建一个
flask.views.View
的子类 - 重写
dispatch_request()
方法。 - 通过使用
as_view()
方法把类转换为实际视图函数。传递给函数的字符串是视图最终的名称。
但是这看不出背后的原理,所以让我们来小小地重构一下:
from flask.views import View
class ListView(View):
def get_template_name(self):
raise NotImplementedError()
def render_template(self, context):
return render_template(self.get_template_name(), **context)
def dispatch_request(self):
context = {
'objects'