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统计文本字符串里单词出现频率的方法
May 26 Python
python实现比较两段文本不同之处的方法
May 30 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
解决Pycharm后台indexing导致不能run的问题
Jun 27 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
Python Collatz序列实现过程解析
Oct 12 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
Python读取YAML文件过程详解
Dec 30 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
Pycharm 解决自动格式化冲突的设置操作
Jan 15 Python
4种方法python批量修改替换列表中元素
Apr 07 Python
Python使用永中文档转换服务
May 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
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
json跟xml的对比分析
2008/06/10 Javascript
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
jQuery chili图片远处放大插件
2009/11/30 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
python创建进程fork用法
2015/06/04 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
代码实例讲解python3的编码问题
2019/07/08 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
Pycharm小白级简单使用教程
2020/01/08 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
介绍一下UNIX启动过程
2013/11/14 面试题
跑吧孩子观后感
2015/06/10 职场文书