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 相关文章推荐
通过C++学习Python
Jan 20 Python
Django内容增加富文本功能的实例
Oct 17 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
利用python如何处理nc数据详解
May 23 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
Python依赖包整体迁移方法详解
Aug 15 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
python 安装移动复制第三方库操作
Jul 13 Python
Python函数调用追踪实现代码
Nov 27 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 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
PHP header函数分析详解
2011/08/06 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
jQuery 动画基础教程
2008/12/25 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
python先序遍历二叉树问题
2017/11/10 Python
python实现简易内存监控
2018/06/21 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
python入门之井字棋小游戏
2020/03/05 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
庆元旦演讲稿
2014/09/15 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
2014年保育员工作总结
2014/12/02 职场文书
项目验收申请报告
2015/05/15 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
浅谈Node的内存泄露问题
2022/05/06 NodeJs
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL