AWS lambda на основе классов в Python

#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 .