使用类来处理请求
在构建Resuful API时,针对相同URL的不同HTTP请求方法都是相互关联的,这时采用基于类进行路由处理,要比使用独立的处理函数要更容易控制和抽象。Sanic在sanic.views
包中提供了基类HTTPMethodView
来支持将路由绑定到类实例并自动匹配不同的HTTP请求方法的行为。
类实例不能使用.route()
修饰器直接进行路由绑定,而是需要使用.add_route()
方法完成路由绑定。以下给出一个可供参考的示例。
from sanic import Sanic
from sanic.views import HTTPMehodView
from sanic.response import text
app = Sanic(__name__)
class ExampleView(HTTPMethodView):
def get(self, request):
return text("The get method")
def post(self, request):
return text("The post method")
def put(self, request):
return text("The put method")
def patch(self, request):
return text("The patch method")
def delete(self, request):
return text("The delete method")
app.add_route(ExampleView.as_view(), "/")
示例中展示的是同步处理函数组成的类,如果需要异步处理函数,则只需要在需要异步的处理函数前使用async
关键字修饰即可。处理函数从URL中收取参数的方式也与独立处理函数是相同的,只是由于现在路由路径是绑定到类的,所以这个类中的所有处理函数都应该能够处理相同的URL路径参数,这与Restful API的风格要求是一致的。
前面章节中对独立处理函数使用的拦截修饰器也可以被用在类上,但是使用形式要发生一些变化。具体可参考以下示例中的两个类。
class AllAuthorizedView(HTTPMethodView):
# 使用 decorators 属性来将拦截修饰器应用到所有处理方法上
decorators = [authorized]
def get(self, request):
pass
def post(self, request):
pass
class PartAuthorizedView(HTTPMethodView):
def get(self, request):
pass
# 直接在需要的处理方法上使用拦截修饰器,但这个处理方法应该是静态方法
@staticmethod
@authorized()
def post(self, request):
pass