#python #amazon-web-services #aws-lambda
#python #amazon-веб-сервисы #aws-lambda
Вопрос:
Я создал функцию AWS lambda на основе классов в Python под названиемrequestHandler.py как показано ниже
from action_dispatcher import ActionDispatcher
class RequestHandler(ActionDispatcher):
@staticmethod
def createTemplate(event, context):
return "Hello world"
Мой action_dispatcher.py выглядит так, как показано ниже.
import json
class ActionDispatcher(object):
def __call__(self, event, context, *args, **kwargs):
action = event.get('action')
handler = getattr(self, action, None)
if handler is None:
return json.loads({'status': 'error', 'code': 404, 'message':"Action {0} not found.".format(action) })
return handler(request, *args, **kwargs)
С этой вышеуказанной настройкой и обработчиком лямбды в качестве RequestHandler.RequestHandler, я получаю ошибку «RequestHandler () не принимает аргументов» в этом случае я создаю действие как createTemplate. итак, я хочу вызвать этот метод из RequestHandler.
Ответ №1:
Мне кажется, что вы пытаетесь вызвать свой класс вместо экземпляра класса. RequestHandler()
вызовет __init__
метод для инициализации экземпляра класса. Поскольку вы не определили метод, он не принимает никаких аргументов. Для доступа __call__
вам необходимо вызвать экземпляр вашего класса.
handler = RequestHandler()
result = handler(request, context, *args, **kwargs)
Комментарии:
1. Это касается вызова AWS lambda, поэтому необходимо предложение, основанное на этом
2. Боюсь, я мало что знаю (или вообще ничего) об AWS. Ваше сообщение об ошибке выглядит так, как будто вы пытаетесь создать экземпляр
RequestHandler
с аргументами вместо вызова экземпляра, что Python не разрешает в вашем текущем коде. Не могли бы вы опубликовать строку кода, в которой происходит вызов?
Ответ №2:
Вы можете определить обработчик в Python только с помощью def handler(event, context):
. Однако я нашел пакет, который позволяет вызывать обработчик как класс
Использование, как указано в их документации, заключается в следующем:
pip install aws-lambda-handler
import aws_lambda
class EchoHandler(aws_lambda.Handler):
"""Echo handler."""
def perform(self, request, **k):
"""Echo perform method."""
response = aws_lambda.Response()
response.body = self.request.event
return response
echo_handler = EchoHandler()
# `echo_handler` is now a callable function you can map your AWS Lambda function to
Ответ №3:
Решение моей проблемы было простым, как упоминал jacinator, я должен попробовать с экземпляром класса. ранее для лямбда-обработчика я использовал класс pass в качестве обработчика, теперь я передаю экземпляр класса в качестве обработчика. Добавлена строка вrequestHandler.py rhandler = RequestHandler()
Итак, раньше мой обработчик lambda был похож requestHandler.RequestHandler
, теперь он был изменен на requestHandler.rhandler
.