Sanic框架基于类的视图用法示例


Posted in Python onJuly 18, 2018

本文实例讲述了Sanic框架基于类的视图用法。分享给大家供大家参考,具体如下:

简介

基于类的视图只是实现对请求响应行为的类,他们提供了一种在同一端点上划分不同HTTP请求类型的处理方式。不是定义和装饰三个不同的处理函数,而是为每个端点支持的请求类型分配一个处理函数,可以为端点分配一个基于类的视图。

定义视图

基于类的视图应该是子类HTTPMethodView,关于HTTPMethodView的简单用法在前面的博文中有简单的提到过。我们可以自定义一个类继承于HTTPMethodView,然后你可以在其中定义各种HTTP请求类型实施方法,如果接收到一个没有定义方法的请求,那么将会产生一个响应:405:Method not allowed

要在端点上注册基于类的视图,除了需要定义一个类来继承HTTPMethodView,那是不够的,还需要调用app.add_route()方法来进行注册。可用的方法包括:getpostputpatchdelete。使用所有方法的类将如下所示:

from sanic import Sanic
from sanic.views import HTTPMethodView
from sanic.response import text
class SanicView(HTTPMethodView):
  def get(self,request):
    return text("it is get")
  def post(self,request):
    return text("it is post")
  def put(self,request):
    return text("it is put")
  def patch(self,request):
    return text("it is patch")
  def delete(self,request):
    return text("it is delete")
app = Sanic()
app.add_route(SanicView.as_view(),"/method_view")
if __name__ == "__main__":
  app.run()

同样,你也可以是用async语法:

class SanicView(HTTPMethodView):
  async def get(self,request):
    return text("it is get")
app.add_route(SanicView.as_view(),"/method_view")

网址参数

如果你需要URL参数,请将其包括在方法的定义中:

class SanicView(HTTPMethodView):
  async def get(self,request,name):
    return text("it is get and name is {}".format(name))
app.add_route(SanicView.as_view(),"/<name>")

装饰器

在之前的讲路由的文章《Sanic框架路由用法》中有提到,如果我们想在处理函数之前处理一些事情,我们可以使用装饰器。同样,在基于类的视图中同样可以使用装饰器来预处理一些事情。如果你想添加装饰器到类中,可以定义一个decorators类变量,这些将在调用as_view()方法时被应用:

def decorator(func):
  async def wrapper(request,*args,**kwargs):
    print("有装饰器")
    response = await func(request,*args,**kwargs)
    return response
  return wrapper
class SanicView(HTTPMethodView):
  decorators = [decorator]
  async def get(self,request):
    return text("it is ok!")
app.add_route(SanicView.as_view(),"/method_view")

重定向

重定向功能在之前的路由文章《Sanic框架路由用法》中也有提到,如果你想在用户访问某个路由时,将其自动跳转至特定的路由,此时就可以使用重定向功能。同样,此功能在基于类的视图中同样能实现,只需要在url_for()方法中将类名传递进来,而后调用redirect()方法:

from sanic.response import redirect
@app.route("/")
async def home(request):
  url = app.url_for("SanicView")
  return redirect(url)
class SanicView(HTTPMethodView):
  async def get(self,request):
    return text("it is get")
app.add_route(SanicView.as_view(),"/method_view")

CompositionView

CompositionView的简单使用在之前的文章《Sanic框架路由用法》当中也有简单提到。作为HTTPMethodVIew的替代方案,你可以使用CompositionView在视图类之外移动处理函数。每个HTTP请求方法的程序处理函数都在源代码中的其他地方定义,然后使用CompositionView.add方法添加到视图中:

from sanic.views import CompositionView
async def handle_get(request):
  return text("it is get")
view = CompositionView()
view.add(["GET"],handle_get)
view.add(["POST","PUT"],lambda request: text("it is post or put"))
app.add_route(view,"/composition_view")

更多关于Python相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现计算资源图标crc值的方法
Oct 05 Python
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
Python常见异常分类与处理方法
Jun 04 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
Django rest framework实现分页的示例
May 24 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
python用post访问restful服务接口的方法
Dec 07 Python
Python实现基于SVM的分类器的方法
Jul 19 Python
Python的形参和实参使用方式
Dec 24 Python
详解python tkinter模块安装过程
Jan 06 Python
python字符串判断密码强弱
Mar 18 Python
Python加密技术之RSA加密解密的实现
Apr 08 Python
flask入门之表单的实现
Jul 18 #Python
Flask入门之上传文件到服务器的方法示例
Jul 18 #Python
flask入门之文件上传与邮件发送示例
Jul 18 #Python
Sanic框架流式传输操作示例
Jul 18 #Python
django 发送邮件和缓存的实现代码
Jul 18 #Python
python实现linux下抓包并存库功能
Jul 18 #Python
python调用tcpdump抓包过滤的方法
Jul 18 #Python
You might like
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
php adodb操作mysql数据库
2009/03/19 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
vue.js父组件使用外部对象的方法示例
2017/04/25 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
Python入门篇之条件、循环
2014/10/17 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Python3实现转换Image图片格式
2018/06/21 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
在keras里实现自定义上采样层
2020/06/28 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
python包的导入方式总结
2021/03/02 Python
一道SQL存储过程面试题
2016/10/07 面试题
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
见习期自我鉴定
2013/11/07 职场文书
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
物流仓管员岗位职责
2013/12/04 职场文书
法制宣传教育方案
2014/05/09 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书