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的*args和**kwargs用法
Nov 01 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
Python处理JSON数据并生成条形图
Aug 05 Python
详解Python3中字符串中的数字提取方法
Jan 14 Python
python机器学习之决策树分类详解
Dec 20 Python
pandas实现选取特定索引的行
Apr 20 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
用python爬取租房网站信息的代码
Dec 14 Python
python yield和Generator函数用法详解
Feb 10 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
Python使用requests模块爬取百度翻译
Aug 25 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实现长连接的方法与注意事项的问题
2013/05/10 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
微信支付开发维权通知实例
2016/07/12 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现进程同步和通信的方法
2018/01/02 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
企业为何需要商业计划书
2013/12/26 职场文书
校园之星获奖感言
2014/01/29 职场文书
小学二年级学生评语
2014/04/21 职场文书
论文指导教师评语
2014/04/28 职场文书
道德演讲稿
2014/05/21 职场文书
物业品质提升方案
2014/06/08 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
工地食品安全责任书
2015/05/09 职场文书
考研经验交流会策划书
2015/11/02 职场文书