美文网首页
grpc在django中的使用

grpc在django中的使用

作者: hoppyf | 来源:发表于2017-08-15 21:16 被阅读0次

最近在做微服务这一块,后端与java合作,自己是python的,所以考虑使用grpc,一点考虑是grpc是http2.0,另一点考虑是老大要求的:)


初步尝试是在python脚本中与java对接接口,经常官方文档的一顿学习,成功调通了接口

https://grpc.io/docs/quickstart/python.html
不过在教程里clone的那个项目实在是大,不确定哪些是需要的,经过测试后给出需要的:

  • grpcio==1.4.0
  • grpcio-tools==1.4.0
  • xxx.proto 没错,只需要这么一个文件
  • 编译xxx.proto的命令

python -m grpc_tools.protoc -I./protos --python_out=. --grpc_python_out=. ./protos/xxx.proto

这里解释一下,python(不解释) -m(也不解释) grpc_tools.protoc(上面安装的三方)
-I./protos(标识当前目录下的protos文件夹,xxx.proto需要在这个文件夹中) --python_out=.(当前目录生成输出文件) --grpc_python_out=.(当前目录生成grpc文件) ./protos/xxx.proto(xxx.proto的相对路径)

在配置好grpc的xxx.proto之后要保证java那边的这个文件要一样(并不是全部,service开始需要完全相同)

运行命令后会生成xxx_pb2.py 和 xxx_pb2_grpc.py两个文件,接下来重点来了(拍桌子)

我既想用django的model又想用grpc该怎么办呢,django是一个服务,grpc是一个服务,直接暴力把grpc代码加入django是没办法使用models和views的。

解决方法就是在greeter_server.py中(这个文件不知道请看上面的链接)加载django,大致如下:

import os
from concurrent import futures

import grpc
import time

import bus_pb2
import bus_pb2_grpc

import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxx.settings")

django.setup()

from enterprise.views import enterprise_list, add_enterprise

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class Greeter(bus_pb2_grpc.BusInfoServicer):
    def BusMethod(self, request, context):
        if request.method == 'e':
            response = enterprise_list(request)
            return bus_pb2.BusReply(data=response['data'], code=response['code'], message=response['msg'])
        elif request.method == 'a':
            response = add_enterprise(request)
            return bus_pb2.BusReply(message=response['msg'])
        return bus_pb2.BusReply(message='')


if __name__ == '__main__':
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    bus_pb2_grpc.add_BusInfoServicer_to_server(Greeter(), server)
    server.add_insecure_port('0.0.0.0:50051')
    server.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

运行时只需要运行该脚本即可,django服务不必启用

相关文章

网友评论

      本文标题:grpc在django中的使用

      本文链接:https://www.haomeiwen.com/subject/dtkvrxtx.html