Серверный перехватчик фреймворка django grpc не работает должным образом

Я использую djangogrpcframework 0.2.1 и пытаюсь написать перехватчик, чтобы увидеть, присутствует ли ключ в метаданных запроса. Я также веду журнал, чтобы видеть прогресс перехватчика.

from grpc import ServerInterceptor, StatusCode


class CustomInterceptor(ServerInterceptor):

    def intercept_service(self, continuation, handler_call_details):
        print("start intercepting")
        metadata = handler_call_details.invocation_metadata

        if 'key' not in metadata:
            context = handler_call_details.invocation_metadata.context()
            context.abort(StatusCode.UNAVAILABLE, 'No key provided')

        return continuation(handler_call_details)

Этот класс находится в path/to/CustomInterceptor. Я добавил этот перехватчик в настройки моего проекта django следующим образом:

GRPC_FRAMEWORK = {
    'ROOT_HANDLERS_HOOK': "project.urls.grpc_handlers",
    'SERVER_INTERCEPTORS': [
        "path.to.CustomInterceptor",
    ]
}

Я запускаю сервер grpc с помощью команды:

python manage.py rungrpcserver

При попытке вызвать любой обработчик с golang-клиента на этот сервер я не вижу никакого журнала хода выполнения перехватчика, и получаю следующую ошибку на моем клиенте

rpc error: code = Unknown desc = Error in service handler!

Я уже пытался проверить, успешно ли сервер импортировал перехватчик, и проблема была не в этом. Я попробовал установить GRPC_VERBOSITY=DEBUG, чтобы увидеть любой журнал ошибок на моем сервере, но журнала не было.

При использовании команды для запуска сервера grpc, кажется, что любой CustomInterceptor не инициализирован и поэтому возникает ошибка из-за неправильного количества входных аргументов для функции intercept_service. Поэтому я изменил функцию на статический метод, и все заработало нормально.

@staticmethod
def intercept_service(continuation, handler_call_details):
    print("start intercepting")
    metadata = handler_call_details.invocation_metadata

    if 'key' not in metadata:
        context = handler_call_details.invocation_metadata.context()
        context.abort(StatusCode.UNAVAILABLE, 'No key provided')

    return continuation(handler_call_details)
Вернуться на верх