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 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
在Python中使用next()方法操作文件的教程
May 24 Python
详解Numpy中的广播原则/机制
Sep 20 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
详解python中的线程与线程池
May 10 Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 Python
python实现小程序推送页面收录脚本
Apr 20 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
Python3 搭建Qt5 环境的方法示例
Jul 16 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
使用python绘制横竖条形图
Apr 21 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
使用 MySQL Date/Time 类型
2008/03/26 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
学习使用bootstrap3栅格系统
2016/04/12 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
微信小程序手机号码验证功能的实例代码
2018/08/28 Javascript
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
python进阶教程之动态类型详解
2014/08/30 Python
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
党校培训自我鉴定范文
2014/03/20 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
永不妥协观后感
2015/06/10 职场文书
工程进度款催款函
2015/06/24 职场文书
四大名著读书笔记
2015/06/25 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技