Проверка параметров строки запроса и тела запроса в AWS lambda с использованием webargs

#python #aws-lambda #aws-api-gateway #request-validation #webargs

#python #aws-lambda #aws-api-gateway #запрос-проверка #webargs

Вопрос:

Я пытаюсь найти способы проверки параметров строки запроса для API, созданного с использованием AWS API gateway и поддерживаемого функцией Python Lambda.API Gateway может проверять наличие требуемых параметров строки запроса. Однако я не смог найти способ для дополнительных проверок, таких как определение того, находится ли длина определенного параметра в пределах некоторого предела (например, config_id должен иметь длину не менее 7 символов). Такие проверки возможны для тела запроса с использованием проверки запроса API Gateway. Обратитесь к этой ссылке. Однако для параметров строки запроса возможна только обязательная / необязательная проверка, поскольку для проверки не используется какая-либо схема json.

Следовательно, чтобы преодолеть эту проблему, я решил попробовать модуль webargs на Python для проверки параметров строки запроса. Обычно он используется для проверки запросов для API, созданных с использованием фреймворков Python, таких как flask или django. Я использую основной анализатор (см. Документ webargs) следующим образом:

 from webargs import fields, validate, core, ValidationError
parser = core.Parser()

params = {"config_id": fields.Str(required=True, validate=lambda p: len(p) >= 7)}

def main(event, context: Dict):
    try:
        # print(event["queryStringParameters"])
        input_params = event.get("queryStringParameters")
        print("queryStringParameters: ", str(input_params))

        if input_params is None:
            input_params = {}
        parsed_params = parser.parse(params, input_params)
        print("parsedParams: ", str(parsed_params))
    except ValidationError as e:
        return {
            "statusCode": 400,
            "headers": {
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Credentials": True,
                "x-amzn-ErrorType": "ValidationError",
            },
            "body": str(e),
        }
 

Вот как выполняется проверка в лямбда-функции. Однако корректно работает только требуемая проверка. Когда я передаю config_id длиной 5, он не возвращает никакой ошибки и продолжает работу в лямбда-функции.

Что может быть не так с этим? Синтаксический анализатор, похоже, работает, однако функция проверки не работает. Любая помощь приветствуется, так как я новичок в этом. Кроме того, есть ли лучший способ проверки в функциях lambda, особенно для queryStringParameters? Это может быть обработано кодом, но у нас может быть много параметров и много API, что делает написание кода для всех таких проверок громоздкой задачей. Модуль webargs пригодится.

Ответ №1:

Библиотека webargs в основном используется для проверки HTTP-запросов, поступающих через популярные фреймворки Python, такие как Flask, Django, Bottle и др. Основной анализатор, который вы пытаетесь использовать, не следует использовать напрямую, поскольку в нем не реализованы такие методы, как load_json, load_query и т. Д. (Исходный код, показывающий отсутствующую реализацию здесь). Для каждой из фреймворков существуют реализации дочернего класса основного анализатора, но использовать их в API GW не имеет смысла.

Поэтому лучше использовать более простую библиотеку проверки json, такую как jsonschema. Я изменил ваш код, чтобы использовать jsonschema вместо webargs следующим образом —

 from jsonschema import validate, ValidationError

schema = {
     "type" : "object",
     "properties" : {
         "queryStringParameters" : {
                "type" : "object",
                "properties": {
                        "config_id": {
                                "type": "string",
                                "minLength": 7,
                        }
                }
        },

     },
 }


def main(event, context):
    try:
        validate(instance=event, schema=schema)
    except ValidationError as e:
        return {
            "statusCode": 400,
            "headers": {
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Credentials": True,
                "x-amzn-ErrorType": "ValidationError",
            },
            "body": e.message,
        }
 

Комментарии:

1. Большое вам спасибо за ваш ответ! Хорошо, я не получил никакой ошибки при использовании основного анализатора. Однако я заметил, что ответ метода parser.parse() представляет собой пустой словарь. Проверка required= True работала, что заставило меня подумать, что другие проверки тоже будут работать.