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中实现贪婪排名算法的教程
Apr 17 Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
python定向爬虫校园论坛帖子信息
Jul 23 Python
python微信公众号之关注公众号自动回复
Oct 25 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
python爬虫基础知识点整理
Jun 02 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
python正则表达式re.search()的基本使用教程
May 21 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 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中养成7个面向对象的好习惯
2010/01/28 PHP
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
DEFER怎么用?
2006/07/01 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
Python 编码处理-str与Unicode的区别
2016/09/06 Python
python与C互相调用的方法详解
2017/07/14 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python获取多线程及子线程的返回值
2017/11/15 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
开工典礼策划方案
2014/05/23 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
初中班干部工作总结
2015/08/10 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang