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 中split 和 strip的实例详解
Jul 12 Python
Python爬虫信息输入及页面的切换方法
May 11 Python
简单了解python PEP的一些知识
Jul 13 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
详解KMP算法以及python如何实现
Sep 18 Python
Python爬取网站图片并保存的实现示例
Feb 26 Python
关于Python使用turtle库画任意图的问题
Apr 01 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
用PHP和ACCESS写聊天室(三)
2006/10/09 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
Javascript 面向对象特性
2009/12/28 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
微信小程序时间轴实现方法示例
2019/01/14 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Python random模块的使用示例
2020/10/10 Python
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
电气工程和自动化自荐信范文
2013/12/25 职场文书
工商管理专业自荐信
2014/06/03 职场文书
认错检讨书
2014/10/02 职场文书
新郎新娘答谢词
2015/01/04 职场文书
预备党员入党感言
2015/08/01 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
基于Redis位图实现用户签到功能
2021/05/08 Redis
为Centos安装指定版本的Docker
2022/04/01 Servers