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写入xml文件的方法
May 08 Python
python 实时遍历日志文件
Apr 12 Python
python基础教程项目四之新闻聚合
Apr 02 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
深入了解Django中间件及其方法
Jul 26 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
python 实现线程之间的通信示例
Feb 14 Python
python输入中文的实例方法
Sep 14 Python
python list的index()和find()的实现
Nov 16 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 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
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
php导入导出excel实例
2013/10/25 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
PHP fclose函数用法总结
2019/02/15 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
python发送HTTP请求的方法小结
2015/07/08 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
Python最小二乘法矩阵
2019/01/02 Python
python aiohttp的使用详解
2019/06/20 Python
Pytorch转tflite方式
2020/05/25 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
赡养老人协议书
2014/04/21 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js