标签: webargs

flask-marshmallow:如何仅在方法为 PUT 时将所有字段标记为可选

我正在制作一个flask restful api,我遇到的问题是marshmallow-sqlalchemy 和webargs

简而言之,这是我的 sqlalchemy 模型:

class User(Model):
    id = Column(String, primary_key=True)
    name = Column(String(64), nullable=False)
    email = Column(String(120), nullable=False)
    password = Column(String(128))
    creation_date = Column(DateTime, default=datetime.utcnow)
Run Code Online (Sandbox Code Playgroud)

这是我的架构

class UserSchema(ModelSchema):
    class Meta:
        model = User
        strict = True
        sqla_session = db.session

user_schema = UserSchema()
Run Code Online (Sandbox Code Playgroud)

以及使用flask-classful和webargs的路线示例:

class UserView(FlaskView):
    trailing_slash = False
    model = User
    schema = user_schema

    @use_kwargs(schema.fields)
    def post(self, **kwargs):
        try:
            entity = self.model()

            for d in kwargs:
                if kwargs[d] is not missing:
                    entity.__setattr__(d, kwargs[d])

            db.session.add(entity)
            db.session.commit()
            o = …
Run Code Online (Sandbox Code Playgroud)

python api flask webargs marshmallow

6
推荐指数
1
解决办法
7683
查看次数

Python 中的 webargs / Marshmallow 可以修改字段,而不仅仅是验证它吗?

我将 Flask 与 Flask-restful 和webargs(使用Marshmallow作为后端)一起使用。目前我可以通过以下方式提取我想要的字段:

class AddGroup(Resource):
    args = {
        'name': fields.Str(missing=None),
        'phone': fields.Str(missing=None),
    }

    @use_args(args)
    def get(self, args):
        name = args['name'].strip()
        # ... some GET-related code ...

    @use_args(args)
    def post(self, args):
        name = args['name'].strip()
        # ... some POST-related code ...
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。但我真正想做的是确保args['name']进入各种方法(“post”、“get”等)时已经删除了空格,这样我就不必每次都手动处理每个变量。(剥离空白只是一个例子 - 它可能是其他一些简单或复杂的转换)

有没有一种方法(通过覆盖 String 字段、定义我自己的字段或其他方式)允许args在到达类方法之前对其进行预处理?

python flask flask-restful webargs marshmallow

5
推荐指数
1
解决办法
2112
查看次数

使用 Webargs Flaskparser 验证 URL 路径和查询参数中的变量参数

我正在尝试验证发送到我的 api 的所有数据。我的 url 结构中包含一个变量 ,/api/v2/users/<string:username>/collections/以及实际的查询字符串参数,所有这些都需要通过验证。

完整的网址如下所示: 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
        )
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我收到验证错误, …

python flask python-3.x webargs

2
推荐指数
1
解决办法
3546
查看次数

标签 统计

flask ×3

python ×3

webargs ×3

marshmallow ×2

api ×1

flask-restful ×1

python-3.x ×1