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 time模块详解(常用函数实例讲解,非常好)
Apr 24 Python
wxPython窗口中文乱码解决方法
Oct 11 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
Python 通过pip安装Django详细介绍
Apr 28 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
pytorch 修改预训练model实例
Jan 18 Python
Django Admin后台添加数据库视图过程解析
Apr 01 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
jupyter 添加不同内核的操作
Feb 06 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实现的解汉诺塔问题算法示例
2018/08/06 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
opencv实现简单人脸识别
2021/02/19 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
python help函数实例用法
2020/12/06 Python
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
大学生优秀的自我评价分享
2013/10/22 职场文书
支部鉴定材料
2014/06/02 职场文书
大学生找工作求职信
2014/07/09 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
教师考核表个人总结
2015/02/12 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL