前言

可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图。可插拨视图的主要用途是用可定制的、可插拨的视图来替代部分 实现。

基本原理

假设有一个函数用于从数据库中载入一个对象列表并在模板中渲染:

@app.route('/users/')
def show_users(page):users = User.query.all()return render_template('users.html', users=users)

上例简单而灵活。但是如果要把这个视图变成一个可以用于其他模型和模板的通用视图, 那么这个视图还是不够灵活。因此,我们就需要引入可插拨的、基于类的视图。第一步, 可以把它转换为一个基础视图:

from flask.views import Viewclass 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() 方法把类转换为实际视图函数。

插拨视图可以像普通函数一样加入应用。加入的方式有两种,一种是使用 route() ,另一种是使用更好的 add_url_rule() 。在加入的视图中应该提供所使用的 HTTP 方法的 名称。提供名称的方法是使用 methods 属性:

from flask.views import View
from flask import requestclass MyView(View):# 定义请求方法methods = ["GET", "POST"]# get请求def get(self):return "get"# post请求def post(self):return "post"# 调度函数,必须重写。不重写,View类会直接抛异常def dispatch_request(self):# 请求方法映射关系request_method = {"get": self.get, "post": self.post}# 通过requset方法获取前端访问的请求方法print(request.method)# 通过请求方法,映射到对应的函数对象view = request_method.get(request.method.lower())# 返回映射到的函数返回值return view()# 注册,用as_view方法
app.add_url_rule("/my", view_func=MyView.as_view("myview"))

看到这可能已经蒙圈,前面是讲基本实现原理,dispatch_request()方法必须要自己重写,并且不好理解怎么去写它,接下来讲简单的实现方式,让大家轻轻松松学会。

MethodView 基于方法调度

MethodView是 前面View 的升级版本,不需要我们写dispatch_request()方法了,接下来看下面更优雅的实现方式

from flask.views import View, MethodViewclass MyView(MethodView):def get(self):return {"code": 0, "msg": "get 请求"}def post(self):return {"code": 0, "msg": "post 请求"}# 注册,用as_view方法
app.add_url_rule("/my", view_func=MyView.as_view("myview"))

使用这种方式,不必提供 methods 属性,它会自动使用相应 的类方法。
于是发get请求,得到结果

GET http://127.0.0.1:5000/my {"code": 0,"msg": "get 请求"
}

发post请求,得到结果

POST http://127.0.0.1:5000/my{"code": 0,"msg": "post 请求"
}

实现restful API风格接口

网络 API 经常直接对应 HTTP 变量,因此很有必要实现基于 MethodView 的 API 。即多数时候, API 需要把不同的 URL 规则应用到同一个方法视图。例如,假设你需要这样使用一个 user 对象:

URL 方法 说明
/users/ GET 给出一个包含所有用户的列表
/users/ POST 创建一个新用户
/users/ GET 显示一个用户
/users/ PUT 更新一个用户
/users/ DELETE 删除一个用户

那么如何使用 MethodView 来实现呢?方法是使用多个规则对应 到同一个视图。

假设视图是这样的:

class UserAPI(MethodView):def get(self, user_id):if user_id is None:# 返回一个包含所有用户的列表passelse:# 显示一个用户passdef post(self):# 创建一个新用户passdef delete(self, user_id):# 删除一个用户passdef put(self, user_id):# update a single userpass

那么如何把这个视图挂接到路由系统呢?方法是增加两个规则并为每个规则显式声明 方法:

user_view = UserAPI.as_view('user_api')
app.add_url_rule('/users/', defaults={'user_id': None},view_func=user_view, methods=['GET',])
app.add_url_rule('/users/', view_func=user_view, methods=['POST',])
app.add_url_rule('/users/<int:user_id>', view_func=user_view,methods=['GET', 'PUT', 'DELETE'])

如果你有许多类似的 API ,那么可以代码如下:

def register_api(view, endpoint, url, pk='id', pk_type='int'):view_func = view.as_view(endpoint)app.add_url_rule(url, defaults={pk: None},view_func=view_func, methods=['GET',])app.add_url_rule(url, view_func=view_func, methods=['POST',])app.add_url_rule('%s<%s:%s>' % (url, pk_type, pk), view_func=view_func,methods=['GET', 'PUT', 'DELETE'])register_api(UserAPI, 'user_api', '/users/', pk='user_id')

装饰视图

视图函数会被添加到路由系统中,而视图类则不会。因此视图类不需要装饰,只能以手工 使用 as_view() 来装饰返回值:

def user_required(f):"""Checks whether user is logged in or raises error 401."""def decorator(*args, **kwargs):if not g.user:abort(401)return f(*args, **kwargs)return decoratorview = user_required(UserAPI.as_view('users'))
app.add_url_rule('/users/', view_func=view)

自 Flask 0.8 版本开始,新加了一种选择:在视图类中定义装饰的列表:

class UserAPI(MethodView):decorators = [user_required]

请牢记:因为从调用者的角度来看,类的 self 被隐藏了,所以不能在类的方法上单独 使用装饰器。

Flask 学习-22.可插拨视图MethodView类相关推荐

  1. Flask学习之旅——3 视图高级

    Flask学习之旅--3 视图高级 前言 本文为<知了传课-- 视图高级>的学习笔记. 蓝图 为什么使用蓝图? 当项目比较大或者代码比较多的时候,让所有的url和视图函数放在同一个文件夹里 ...

  2. Flask学习之旅——1.3 URL与视图(二)

    Flask学习之旅--1.3 URL与视图(二) 前言 由于本小节内容较多,故分成几篇文章来记录. 本文为<知了传课--URL与视图>的学习笔记. 原文地址:第三节:URL与视图 - Py ...

  3. Flask学习之旅——1.3 URL与视图(一)

    Flask学习之旅--1.3 URL与视图(一) 前言 由于本小节内容较多,故分成几篇文章来记录. 本文为<知了传课--URL与函数的映射>的学习笔记. 原文地址:第三节:URL与视图 - ...

  4. Flask学习之旅——1.3 URL与视图(三)

    Flask学习之旅--1.3 URL与视图(三) 前言 由于本小节内容较多,故分成几篇文章来记录. 本文为<知了传课--URL与视图>的学习笔记. 原文地址:第三节:URL与视图 - Py ...

  5. Flask学习笔记总结(一)

    Flask学习笔记总结(一) 说明:开始在csdn上面记录一些关于自己学习技术的笔记总结. 文章目录 Flask学习笔记总结(一) 前言 一.python的web三大框架 二.flask入门 1.ws ...

  6. html与java接口,JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习--Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  7. Flask学习笔记(四): Flask与数据库连接

    Flask学习笔记(四): Flask与数据库连接 前言 前面我们学习了Flask如何构建一个程序的流程,又研究了它的路由如何设定,还对如何获取模板表单数据进行了梳理,值得一提的就是Flask和SQL ...

  8. Python学习22:Python之禅和PEP 8规范

    笔者:风起怨江南 出处:https://blog.csdn.net/JackMengJin 笔者原创,文章转载需注明,如果喜欢请点赞+关注,感谢支持! 导读:Python之禅和PEP 8规范,值得所有 ...

  9. 千锋Flask学习笔记

    千锋Flask学习笔记 文章目录 千锋Flask学习笔记 写在前面 1. Flask介绍 2. Views 3. Request 4. Response 5. 会话技术 6. 模型和模板 7. 数据传 ...

最新文章

  1. cocos2dx-Lua与Object的通讯机制
  2. QNNPACK高性能前向内核库全面剖析——引言篇
  3. jsf 传参数_在JSF 2中对定制验证器进行参数化
  4. 软件架构(10)---java资深架构师分布式技术分享
  5. 后台管理系统、商品管理、商品发布、商品回收、订单管理、退款管理、运营管理、商城设置、导航分类、营销管理、优惠券套餐、数据统计、活跃用户、数据埋点、财务管理、对账单、财务数据、账户资产、电商后台
  6. 古代的政令 —— 两汉均输
  7. PLC -- 可编程逻辑控制器
  8. SAI绘制波浪卷发教程
  9. Ubuntu 11.10ibus万能五笔
  10. 【期刊会议】机器学习深度学习 + 计算机视觉(To be continued..)
  11. Delphi学习第一课
  12. dell服务器设置bios设置u盘启动不了系统,详解戴尔通过BIOS设置U盘启动的技巧
  13. 产品经理知识体系——职责
  14. uniapp如何使用uview中的loadmore上拉加载
  15. 微型计算机的最少配是,只有SD卡大小的微型电脑 配Atom处理器
  16. Processing创意编程(入门篇)
  17. php中ne,eq相等 ne、neq不相等, gt大于, lt小于
  18. python 福利_python 处理json
  19. 【Simulink教程案例6】基于Simulink的自适应PID控制器设计与实现
  20. 如何解除计算机上的安全警报,Win7安全警报怎么关闭?Win7关闭安全警报的方法...

热门文章

  1. NB-IoT与OneNET平台HTTP通信
  2. 【饭谈】:开发说他要是不写bug,测试就会失业了。
  3. win11一开机就显示“无法打开这个应用,查看Microsoft store,了解有关Nahimic的详细信息”怎么解决?
  4. CAD图纸转换成高质量的PDF文件,两种方法一步搞定哦
  5. python社区微信群_Python 打造微信群聊天机器人(带操作界面)-Go语言中文社区...
  6. 【整理归纳】Linux中文件的Access,Modify,Change区别
  7. 怎么在电脑的右键新建菜单添加.py或者其他格式的文件
  8. 联通光猫TEWA-800E设置桥接模式
  9. 虚拟机挂载ISO文件
  10. MySQL学习宝典之最全的常用语法语句