Проверка параметров переменной в 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

Две переменные, которые должны быть проверены: usernamepage, а также 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
        )
Другие вопросы по тегам