grpc在python中的使用
django-grpc-framework
简单使用python创建grpc服务
首先安装依赖
pip install django
pip install djangorestframework
pip install djangogrpcframework
pip install grpcio
pip install grpcio-tools
django框架,所有我们创建项目
django-admin startproject 项目名
cd 到项目目录,创建一个子应用-- user
python manage.py startapp user
注册
INSTALLED_APPS = [
...
'django_grpc_framework',
user,
]
使用mysql数据库,我们user下的model.py文件
from django.db import models
class User(models.Model):
name= models.CharField(max_length=100)
age= models.IntegerField()
sex= models.BooleanField()
class Meta:
db_table = 'db_user'
数据库迁移
python manage.py makemigrations user
python manage.py migrate
写一个.proto文件,需要定义服务名,方法名,参数名
在项目目录下新建 protos/user_proto/user.proto
syntax = "proto3";
package user_proto;
import "google/protobuf/empty.proto";
service UserController {
rpc List(UserListRequest) returns (stream User) {}
}
message User{
int32 id = 1;
string name= 2;
int32age= 3;
}
message UserListRequest {
}
执行命令,生成服务文件和参数文件
python -m grpc_tools.protoc --proto_path=./protos --python_out=./ --grpc_python_out=./ ./protos/user_proto/user.proto
在子应用user下创建serializer.py文件,定义序列化器类
from django_grpc_framework import proto_serializerss
from user.models import User
from user_proto import user_pb2
class UserProtoSerializer(proto_serializers.ModelProtoSerializer):
class Meta:
model = User
proto_class = user_pb2.User
fields = ['id', 'name', 'age']
在子应用user下创建services.py,编写服务
import grpc
from django_grpc_framework.services import Service
from user.models import User
from user.serializers import UserProtoSerializer
class UserService(Service):
def List(self, request, context):
users= User.objects.all()
serializer = UserProtoSerializer(users, many=True)
for msg in serializer.message:
yield msg
最后,我们需要连接服务,在子应用user下创建handlers.py文件:
from user._services import User'Service
from user_proto import user_pb2_grpc
def grpc_handlers(server):
user_pb2_grpc.add_UserControllerServicer_to_server(UserService.as_servicer(), server)
另外,我们还需要在项目文件下创建urls.py 文件中的根处理程序conf ,包括我们应用程序的grpc处理程序:
from user.handlers import grpc_handlers as user_grpc_handlers
urlpatterns = []
def grpc_handlers(server):
user_grpc_handlers(server)
启动服务
python manage.py grpcrunserver --dev
客户端的编写
import grpc
from user_proto import user_pb2, post_pb2_grpc
with grpc.insecure_channel('localhost:50051') as channel:
stub = user_pb2_grpc.UserControllerStub(channel)
print('----- List -----')
for user in stub.List(user_pb2.UserListRequest()):
print(user, end='')
数据库需要另外配置,服务端启动后,再运行客户端,数据库有数据就可以输出
官方文档地址
https://djangogrpcframework.readthedocs.io/en/latest/services.html