Source code for grpc_framework.server

"""
Server for grpc_framework.
"""
from concurrent import futures
import contextlib

import grpc

from django.conf import settings

from grpc_framework.settings import grpc_settings
from grpc_framework.service import Service
from grpc_framework.signals import grpc_server_init, grpc_server_started, grpc_server_shutdown
from grpc_framework.utils.log import configure_logging
from grpc_framework.exceptions import ServerException


[docs]class GrpcServer: """GrpcServer""" def __init__(self, max_workers=5, ssl=False): self.max_workers = max_workers self.ssl = ssl self.interceptors = self.add_interceptors() self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=self.max_workers), interceptors=self.interceptors) grpc_server_init.send(None, server=self.server) configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
[docs] def add_interceptors(self): interceptors = [] for interceptor in grpc_settings.INTERCEPTORS: interceptors.append(interceptor[0](**interceptor[1])) return interceptors
[docs] @contextlib.contextmanager def start(self, address, port, *args, **kwargs): self.add_services() if self.ssl is True: server_certificate_key = kwargs.pop('certificate_key', None) server_certificate = kwargs.pop('certificate', None) root_certificate = kwargs.pop('root_certificate', None) if not server_certificate_key or not server_certificate: raise ServerException require_client_auth = True if root_certificate else False server_credentials = grpc.ssl_server_credentials(((server_certificate_key, server_certificate),), root_certificate, require_client_auth) self.server.add_secure_port(f'{address}:{port}', server_credentials) else: self.server.add_insecure_port(f'{address}:{port}') grpc_server_started.send(None, server=self.server) self.server.start() try: yield self.server finally: grpc_server_shutdown.send(None, server=self.server)
[docs] def add_services(self): grpc_apps = grpc_settings.grpc_apps for grpc_app in grpc_apps: service = Service(grpc_app) handler = service.find_handler() handler(service.service_class(), self.server)