首页 > 编程 > Python > 正文

Sanic框架基于类的视图用法示例

2020-02-15 22:27:29
字体:
来源:转载
供稿:网友

本文实例讲述了Sanic框架基于类的视图用法。分享给大家供大家参考,具体如下:

简介

基于类的视图只是实现对请求响应行为的类,他们提供了一种在同一端点上划分不同HTTP请求类型的处理方式。不是定义和装饰三个不同的处理函数,而是为每个端点支持的请求类型分配一个处理函数,可以为端点分配一个基于类的视图。

定义视图

基于类的视图应该是子类HTTPMethodView,关于HTTPMethodView的简单用法在前面的博文中有简单的提到过。我们可以自定义一个类继承于HTTPMethodView,然后你可以在其中定义各种HTTP请求类型实施方法,如果接收到一个没有定义方法的请求,那么将会产生一个响应:405:Method not allowed。

要在端点上注册基于类的视图,除了需要定义一个类来继承HTTPMethodView,那是不够的,还需要调用app.add_route()方法来进行注册。可用的方法包括:getpostputpatchdelete。使用所有方法的类将如下所示:

from sanic import Sanicfrom sanic.views import HTTPMethodViewfrom sanic.response import textclass 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 wrapperclass SanicView(HTTPMethodView):  decorators = [decorator]  async def get(self,request):    return text("it is ok!")app.add_route(SanicView.as_view(),"/method_view")            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表