#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 работала, что заставило меня подумать, что другие проверки тоже будут работать.