基于类的视图

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

定义视图

基于类的视图应该是httpMethodView的子类。然后,您可以为想要支持的每个HTTP请求类型实现类方法。如果接收到没有定义方法的请求,将生成405:方法不允许的响应。

要在端点上注册基于类的视图,请使用app.add_route方法。第一个参数应该是已定义的类,方法为“view invoked”,第二个参数应该是URL端点。

可用的方法有get、post、put、patch和delete。使用所有这些方法的类如下所示。

from sanic import Sanic
from sanic.views import HTTPMethodView
from sanic.response import text

app = Sanic('some_name')

class SimpleView(HTTPMethodView):

  def get(self, request):
      return text('I am get method')

  def post(self, request):
      return text('I am post method')

  def put(self, request):
      return text('I am put method')

  def patch(self, request):
      return text('I am patch method')

  def delete(self, request):
      return text('I am delete method')

app.add_route(SimpleView.as_view(), '/')

您也可以使用异步语法。

from sanic import Sanic
from sanic.views import HTTPMethodView
from sanic.response import text

app = Sanic('some_name')

class SimpleAsyncView(HTTPMethodView):

  async def get(self, request):
      return text('I am async get method')

app.add_route(SimpleAsyncView.as_view(), '/')

URL参数

如果您需要任何URL参数(如《路由指南》中所述),请将它们包括在方法定义中。

class NameView(HTTPMethodView):

  def get(self, request, name):
    return text('Hello {}'.format(name))

app.add_route(NameView.as_view(), '/<name>')

装饰者

如果要向类中添加任何修饰符,可以设置decorators类变量。这些将在调用as-view时应用于类。

class ViewWithDecorator(HTTPMethodView):
  decorators = [some_decorator_here]

  def get(self, request, name):
    return text('Hello I have a decorator')

  def post(self, request, name):
    return text("Hello I also have a decorator")

app.add_route(ViewWithDecorator.as_view(), '/url')

但是如果你只想装饰一些功能,而不是所有的功能,你可以这样做:

class ViewWithSomeDecorator(HTTPMethodView):

    @staticmethod
    @some_decorator_here
    def get(request, name):
        return text("Hello I have a decorator")

    def post(self, request, name):
        return text("Hello I don't have any decorators")

网址构建

如果您希望为httpmethodview构建一个URL,请记住类名将是您将传递到url_的端点。例如:

@app.route('/')
def index(request):
    url = app.url_for('SpecialClassView')
    return redirect(url)


class SpecialClassView(HTTPMethodView):
    def get(self, request):
        return text('Hello from the Special Class View!')


app.add_route(SpecialClassView.as_view(), '/special_class_view')

使用合成视图

作为httpMethodView的替代方法,可以使用compositionView将处理程序函数移动到视图类之外。

每个支持的HTTP方法的处理程序函数在源代码的其他地方定义,然后使用compositionview.add方法添加到视图中。第一个参数是要处理的HTTP方法列表(例如 [“得到”,“邮寄”] ,第二个是处理函数。下面的示例显示了对外部处理程序函数和内联lambda的compositionview用法:

from sanic import Sanic
from sanic.views import CompositionView
from sanic.response import text

app = Sanic(__name__)

def get_handler(request):
    return text('I am a get method')

view = CompositionView()
view.add(['GET'], get_handler)
view.add(['POST', 'PUT'], lambda request: text('I am a post/put method'))

# Use the new view to handle requests to the base URL
app.add_route(view, '/')

注意:当前无法使用url_为合成视图生成url。