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

yipeiwu_com6年前Python基础

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

简介

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

定义视图

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

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

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语法:

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 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()方法:

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方法添加到视图中:

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相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

利用Python找出序列中出现最多的元素示例代码

前言 Python包含6种内置的序列:列表、元组、字符串 、Unicode字符串、buffer对象、xrange对象。在序列中的每个元素都有自己的编号。列表与元组的区别在于,列表是可以修...

tensorflow实现简单的卷积网络

使用tensorflow实现一个简单的卷积神经,使用的数据集是MNIST,本节将使用两个卷积层加一个全连接层,构建一个简单有代表性的卷积网络。 代码是按照书上的敲的,第一步就是导入数据库...

Django框架之DRF 基于mixins来封装的视图详解

基础视图 示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由、视图函数、序列化单独创建py文件 # 配置路由 from django.conf.urls imp...

python基础教程之Hello World!

Python命令行 假设你已经安装好了Python, 那么在Linux命令行输入: 复制代码 代码如下: $python 将直接进入python。然后在命令行提示符>>&g...

Python可变参数*args和**kwargs用法实例小结

Python可变参数*args和**kwargs用法实例小结

本文实例讲述了Python可变参数*args和**kwargs用法。分享给大家供大家参考,具体如下: 一句话简单概括:当函数的参数不确定的时候就需要用到*args和**kwargs,前者...