使用类来处理请求

在构建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