Серверный перехватчик фреймворка 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)