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之Character string(实例讲解)
Sep 25 Python
python删除服务器文件代码示例
Feb 09 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
对python模块中多个类的用法详解
Jan 10 Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
Python调用Redis的示例代码
Nov 24 Python
python中绕过反爬虫的方法总结
Nov 25 Python
python3实现常见的排序算法(示例代码)
Jul 04 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 数组基础知识小结
2010/08/20 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
原生js二级联动效果
2017/06/20 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
python3获取url文件大小示例代码
2019/09/18 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
黄继光的英雄事迹材料
2014/02/13 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
致共产党员倡议书
2014/04/16 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
客户付款通知书
2015/04/23 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python
使用 Apache 反向代理的设置技巧
2022/01/18 Servers