本文实例讲述了Sanic框架基于类的视图用法。分享给大家供大家参考,具体如下:
简介
基于类的视图只是实现对请求响应行为的类,他们提供了一种在同一端点上划分不同HTTP请求类型的处理方式。不是定义和装饰三个不同的处理函数,而是为每个端点支持的请求类型分配一个处理函数,可以为端点分配一个基于类的视图。
定义视图
基于类的视图应该是子类HTTPMethodView
,关于HTTPMethodView
的简单用法在前面的博文中有简单的提到过。我们可以自定义一个类继承于HTTPMethodView
,然后你可以在其中定义各种HTTP请求类型实施方法,如果接收到一个没有定义方法的请求,那么将会产生一个响应:405:Method not allowed。
要在端点上注册基于类的视图,除了需要定义一个类来继承HTTPMethodView
,那是不够的,还需要调用app.add_route()
方法来进行注册。可用的方法包括:get
、post
、put
、patch
和delete
。使用所有方法的类将如下所示:
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程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]