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的几条建议分享
Feb 10 Python
python使用win32com库播放mp3文件的方法
May 30 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
python线程的几种创建方式详解
Aug 29 Python
python制作朋友圈九宫格图片
Nov 03 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
Python使用pyenv实现多环境管理
Feb 05 Python
Python基础之函数嵌套知识总结
May 23 Python
python 爬取吉首大学网站成绩单
Jun 02 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中in_array函数用法探究
2014/11/25 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
幼儿园元旦活动感言
2014/03/02 职场文书
求职简历自我评价范例
2014/03/12 职场文书
授权委托书样本
2014/04/03 职场文书
党员承诺书怎么写
2014/05/20 职场文书
化工专业求职信
2014/07/01 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
员工离职感谢信
2015/01/22 职场文书
2015年科普工作总结
2015/07/23 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书