本文实例讲述了Sanic框架基于类的视图用法。分享给大家供大家参考,具体如下:
简介
基于类的视图只是实现对请求响应行为的类,他们提供了一种在同一端点上划分不同HTTP请求类型的处理方式。不是定义和装饰三个不同的处理函数,而是为每个端点支持的请求类型分配一个处理函数,可以为端点分配一个基于类的视图。
定义视图
基于类的视图应该是子类HTTPMethodView
,关于HTTPMethodView
的简单用法在前面的博文中有简单的提到过。我们可以自定义一个类继承于HTTPMethodView
,然后你可以在其中定义各种HTTP请求类型实施方法,如果接收到一个没有定义方法的请求,那么将会产生一个响应:405:Method not allowed。
要在端点上注册基于类的视图,除了需要定义一个类来继承HTTPMethodView
,那是不够的,还需要调用app.add_route()
方法来进行注册。可用的方法包括:get
、post
、put
、patch
和delete
。使用所有方法的类将如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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
语法:
1
2
3
4
|
class SanicView(HTTPMethodView):
async def get( self ,request):
return text( "it is get" )
app.add_route(SanicView.as_view(), "/method_view" )
|
网址参数
如果你需要URL参数,请将其包括在方法的定义中:
1
2
3
4
|
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()
方法时被应用:
1
2
3
4
5
6
7
8
9
10
11
|
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()
方法:
1
2
3
4
5
6
7
8
9
|
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
方法添加到视图中:
1
2
3
4
5
6
7
|
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程序设计有所帮助。
原文链接:https://blog.csdn.net/y472360651/article/details/80230380