Проверка параметров переменной в URL-пути и параметрах запроса с помощью Webargs Flaskparser
Я пытаюсь проверить все данные, отправляемые на мой API. Моя структура URL содержит переменную внутри нее, /api/v2/users/<string:username>/collections/
, а также фактические параметры строки запроса, все из которых должны пройти проверку.
Полный URL выглядит так: https://127.0.0.1:5000/api/v2/users/<string:username>/collections/?page=5&per_page=10
Две переменные, которые должны быть проверены: username
page
, а также per_page
, Простым решением было бы изменить мою структуру URL, но мне интересно, возможно ли выполнить то, что мне нужно, и сохранить ту простоту, которая у меня есть в настоящее время, без добавления дополнительной проверки в моем классе ресурсов. Если это возможно, как ты это делаешь?
class UserCollections(Resource):
@use_args({
'username': fields.Str(
required=True,
validate=username_length,
error_messages=dict(
required='Username is required.',
validator_failed='Username can be between 3 and 25 characters.',
)
),
'page': fields.Int(
#required=True,
missing=1,
validate=feed_minmax_pages,
error_messages=dict(
validator_failed='Maximum number of pages reached.',
)
),
'per_page': fields.Int(
#required=True,
missing=5,
validate=validate.Range(min=5,max=25),
error_messages=dict(
validator_failed='Test number of pages reached.',
)
),
}, locations=('query',))
def get(self, args, username):
print(args)
print(username)
return default_schema(
data={},
http_status=200
)
Когда я запускаю код, я получаю ошибку проверки для username
потому что это не существует в аргах.
1 ответ
Немного покопавшись, я наткнулся на решение, которое я сейчас вижу в документации к webargs flaskparser.
Это может легко использоваться в дополнение к другим use_args location
параметры в аргументах. Похоже, что функция метода запроса get
, post
и т. д. все еще требует, чтобы вы передали эту переменную URL В моем случае это было <username>
,
class UserCollections(Resource):
@use_args({
'username': fields.Str(
location='view_args',
required=True,
validate=username_length,
error_messages=dict(
required='Username is required.',
validator_failed='Username can be between 3 and 25 characters.',
)
),
'page': fields.Int(
location='query',
missing=1,
validate=feed_minmax_pages,
error_messages=dict(
validator_failed='Maximum number of pages reached.',
)
),
'per_page': fields.Int(
location='query',
missing=5,
validate=validate.Range(min=5,max=25),
error_messages=dict(
validator_failed='Test number of pages reached.',
)
),
})
def get(self, args, username):
print(args) # access with args['username']
print(username) # would be nice to not have a second of the same var
return default_schema(
data={},
http_status=200
)