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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Python入门必须知道的11个知识点
Mar 21 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 Python
python @classmethod 的使用场合详解
Aug 23 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
python3 使用traceback定位异常实例
Mar 09 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
通过实例解析Python RPC实现原理及方法
Jul 07 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
3.从实例开始
2006/10/09 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
Convert Seconds To Hours
2007/06/16 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
Python中的rfind()方法使用详解
2015/05/19 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
简述 Python 的类和对象
2020/08/21 Python
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
管理信息系学生的自我评价
2014/01/11 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
结婚典礼主持词
2015/06/29 职场文书
高三毕业感言
2015/07/30 职场文书
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js