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中3种内建数据结构:列表、元组和字典
Nov 30 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
Python 备份程序代码实现
Mar 06 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
pycharm修改file type方式
Nov 19 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
django和flask哪个值得研究学习
Jul 31 Python
Django缓存Cache使用详解
Nov 30 Python
python Zmail模块简介与使用示例
Dec 19 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
利用python做表格数据处理
Apr 13 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
ZF等常用php框架中存在的问题
2008/01/10 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
Jquery ui css framework
2010/06/28 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
wxPython窗口中文乱码解决方法
2014/10/11 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
20行python代码实现人脸识别
2019/05/05 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
python查看数据类型的方法
2019/10/12 Python
python实现银行管理系统
2019/10/25 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
详解pandas apply 并行处理的几种方法
2021/02/24 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
公司会计主管岗位责任制
2014/03/01 职场文书
技校毕业生自荐书
2014/05/23 职场文书
2014年电工工作总结
2014/11/20 职场文书
工作保证书怎么写
2015/02/28 职场文书
人事任命通知
2015/04/20 职场文书
党员承诺书格式范文
2015/04/28 职场文书