Sanic是一个类似Flask的Python 3.5+ Web服务器,它的写入速度非常快。除了Flask之外,Sanic还支持异步请求处理程序。这意味着你可以使用Python 3.5中新的闪亮的异步/等待语法,使你的代码非阻塞和快速。
在上一篇博文中已经讲到,如何在Sanic中使用COOKIE,接下来将介绍一下Sanic的流的使用:
请求流式传输
Sanic允许通过流获取请求数据,如下所示,当请求结束时,request.stream.get()
返回为None
,只有post
、put
和patch decorator
拥有流参数:
from sanic.response import stream@app.post("/post_stream",stream=True)
async def post_stream(request):async def streaming(response):while True:body = await request.stream.get()if body is None:breakbody = body.decode("utf-8")reponse.write(body)return stream(streaming)@app.put("/put_stream",stream=True)
async def put_stream(request):async def streaming(response):while True:body = await request.stream.get()if body is None:breakbody = body.decode("utf-8")response.write("utf-8")return stream(streaming)
除了上述例子的方法之外,我们之前还讲过用add_route
方法动态添加路由:
from sanic.response import text
from sanic.views import HTTPMethodView
from sanic.views import stream as stream_decoratorclass StreamView(HTTPMethodView)@stream_decoratorasync def post(self,request)result = ''while True:body = await request.stream.get()if body is None:breakbody = body.decode('utf-8')result += bodyreturn text(result)app.add_route(StreamView.as_view(),"/method_view")
值得注意的是,stream_decorator
装饰器中处理函数的函数名称,若为post
则为post
请求,若为put
则为put
请求。在之前讲述路由的博文中讲到一个CompositionView
类来自定义一个路由,CompositionView
在流式请求中同样适用:
from sanic.views import CompositionViewasync def post_stream_view(request):result = ''while True:body = await request.stream.get()if body is None:breakbody = body.decode('utf-8')result += bodyreturn text(result)view = CompositionView()
view.add(['POST'],post_stream_view,stream=True)
app.add_route(view,"/post_stream_view")
响应流式传输
Sanic允许你使用stream
方法将内容传输到客户端,该方法接受一个通过StreamingHTTPResponse
传入的对象的协程回调,举个栗子:
from sanic.response import stream@app.route("/post_stream_info",methods=["POST"])
async def post_stream_info(request):async def streaming(response):response.write("no")response.write("bug")return stream(streaming)