美文网首页
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