Python的gRPCWeb

sonora的Python项目详细描述


CircleCI

索诺拉

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。在

Snek

怎么做的?在

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_channelAPI,而是使用了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())

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法排序。如何按名称对对象列表进行排序?   java Im正在尝试使用setcolumnwidth在excel 2010上设置列宽   java如何使Axis1.4不为同一个XML名称空间生成多个前缀?   Java:排序索引数组   Java Swing BasicStroke向左偏小   在Android中使用Niimbot蓝牙打印机进行java打印   java阻止tomcat记录特定异常   在将对象的引用变量用作形式参数的情况下,java无法在实际参数中传递该对象的引用变量   java如何在OkHttpClient中设置整个超时?   java中的数组最小/最大lambda表达式   java寻找合适的逻辑   java Jackson JSON处理器故障   java如何合并两个web项目?   java如何使由两个不同图形对象绘制的两个对象相交?   java我应该以什么方式测试更新方法?   java如何建立到的socket连接。在Android Studio上使用SilverTunnelNG的洋葱url?还有别的选择吗?   javajavax。坚持不懈坚持不懈getPersistenceUtil()Ljavax/persistence/PersistenceUtil   带有SuperCSV的CSV文件中的java Skip可选标头