Python的gRPCWeb
sonora的Python项目详细描述
索诺拉
Sonora是一个基于标准Python api(如WSGI和ASGI)构建的grpcweb的Python首个实现,便于集成。在
为什么?在
普通的gRPC有很多优点,但在某些环境中使用起来很难。gRPC网络使gRPC工作变得容易 需要HTTP/1.1但googlegrpc和grpcweb实现不喜欢与普通Python共存的环境 像Django或Flask这样的框架。Sonora不在乎使用什么ioloop,这意味着您可以在任何其他Python上运行它 web框架在同一个应用程序中!在
这样就很容易
- 将gRPC添加到现有的代码库中。在
- 在AWS和其他HTTP/1.1负载平衡器之后运行gRPC。在
- 与其他ASGI框架集成,如Channels、Starlette、Quart等
- 与其他WSGI框架集成,如Flask、Django等
索诺拉这个名字的灵感来自于Sonoran gopher snake。在
怎么做的?在
Sonora被设计成只需要对现有Python应用程序进行最小的更改。在
服务器
WSGI
通常,WSGI应用程序(such as your favourite Django app)将在某处有一个名为wsgi.py
的文件
这样就可以设置应用程序并为您选择的web服务器做好准备。在
fromdjango.core.wsgiimportget_wsgi_applicationapplication=get_wsgi_application()
你的应用服务器(uWSGI,Gunicorn等)知道你的代码在哪里。在
要将Sonora的grpcweb功能添加到像上面这样的应用程序中,您需要做的就是启用它。在
^{pr2}$现在在一个端口下有一个组合的HTTP/1.1django+gRPC应用程序。在
ASGI
对于ASGI来说,基本上是一样的,这里显示的示例与Quart集成,但对于其他框架来说,它或多或少是相同的。在
fromsonora.asgiimportgrpcASGIfromquartimportQuartimporthelloworld_pb2_grpc# Setup your frameworks default ASGI app.application=Quart(__name__)# Install the Sonora grpcASGI middleware so we can handle requests to gRPC's paths.application=grpcASGI(application)# Attach your gRPC server implementation.helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(),application)
现在您有了一个组合的HTTP/1.1quart+gRPC应用程序,它们都在一个端口下。在
客户
Sonora目前只提供基于请求的syncapi实现。在
请求(同步)
我们没有使用gRPCs本机的grpc.insecure_channel
API,而是使用了sonora.client.insecure_web_channel
,它为grpcweb服务器提供了一个requests支持的客户端通道。e、 g
importsonora.clientwithsonora.client.insecure_web_channel(f"http://localhost:8080")aschannel:stub=helloworld_pb2_grpc.GreeterStub(channel)print(stub.SayHello("world"))
Aiohttp(异步)
我们用grpc.aio.insecure_channel
代替sonora.aio.insecure_web_channel
,它为grpcweb提供了一个基于aiohttp的异步兼容客户端。e、 g
importsonora.aioasyncwithsonora.aio.insecure_web_channel(f"http://localhost:8080")aschannel:stub=helloworld_pb2_grpc.GreeterStub(channel)print(awaitstub.SayHello("world"))stub=helloworld_pb2_grpc.GreeterStub(channel)asyncforresponseinstub.SayHelloSlowly("world"):print(response)
它还支持gRFC L58引入的新流式响应API
importsonora.aioasyncwithsonora.aio.insecure_web_channel(f"http://localhost:8080")aschannel:stub=helloworld_pb2_grpc.GreeterStub(channel)asyncwithstub.SayHelloSlowly("world")asresponse:print(awaitresponse.read())
- 项目
标签: