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的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
如何将python中的List转化成dictionary
Aug 15 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
python模拟事件触发机制详解
Jan 19 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
Python requests库用法实例详解
Aug 14 Python
python Django里CSRF 对应策略详解
Aug 05 Python
Python字典添加,删除,查询等相关操作方法详解
Feb 07 Python
Python 面向对象部分知识点小结
Mar 09 Python
基于python实现数组格式参数加密计算
Apr 21 Python
python 进程池pool使用详解
Oct 15 Python
python音频处理的示例详解
Dec 23 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中实现图片的锐化
2006/10/09 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
javascript闭包入门示例
2014/04/30 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
Python 定义只读属性的实现方式
2020/03/05 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
后勤主管岗位职责
2014/03/01 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
金融管理专业求职信
2014/07/10 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
离婚协议书样本
2015/01/26 职场文书
感恩父母主题班会
2015/08/12 职场文书
大队委员竞选稿
2015/11/20 职场文书
担保书怎么写 ?
2019/04/22 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
浅谈Redis的几个过期策略
2021/05/27 Redis
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python