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 创建子进程模块subprocess详解
Apr 08 Python
python语言使用技巧分享
May 31 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
Python 实现12306登录功能实例代码
Feb 09 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
Feb 24 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Python接口测试数据库封装实现原理
May 09 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
python 下划线的不同用法
Oct 24 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
Python查找相似单词的方法
2015/03/05 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
python cs架构实现简单文件传输
2020/03/20 Python
python多任务及返回值的处理方法
2019/01/22 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
什么时候需要进行强制类型转换
2016/09/03 面试题
幼儿园园长岗位职责
2013/11/26 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
大学毕业感言50字
2014/02/07 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
JS 基本概念详细介绍
2021/10/16 Javascript