【问题标题】:Post complex objects with Flask-marshmallow and flask-restful使用 Flask-marshmallow 和 flask-restful 发布复杂的对象
【发布时间】:2015-03-21 18:27:49
【问题描述】:

我正在开发一个 API 来使用 flask-restful 和 flask-marshmallow 来学习 Flask,我想知道是否可以一次发布和序列化复杂对象的列表。

这是我当前的代码:

class Post(db.Document):
    created_at = db.DateTimeField(default=datetime.now, required=True)
    title = db.StringField(max_length=255, required=True)
    slug = db.StringField(max_length=255, required=True)
    body = db.StringField(required=True)
    comments = db.ListField(db.EmbeddedDocumentField('Comment'))

    meta = {
        'allow_inheritance': True,
        'indexes': ['-created_at', 'slug'],
        'ordering': ['-created_at']
    }


class Comment(db.EmbeddedDocument):
    created_at = db.DateTimeField(default=datetime.now, required=True)
    body = db.StringField(verbose_name="Comment", required=True)
    author = db.StringField(verbose_name="Name", max_length=255, required=True)


class PostSerializer(Serializer):
    id = fields.String()
    class Meta:
        additional = ("created_at", "title", "slug", "body", "comments")


# just a test for multiple data
class PostViewList(Resource):
    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('posts', type = str, action='append',
                                   required = True, help = 'No posts given',
                                   location='json')

    def post(self):
        args = self.reqparse.parse_args()

        serializer = PostSerializer(many=True)
        result = serializer.load(args['posts'])

        return args["posts"], 201

api.add_resource(PostViewList, '/posts')

现在的情况是,我在“serializer.load”上收到一个错误,因为帖子没有被视为对象,而是被视为字符串。如果我不尝试序列化并返回“args ['posts']”,它会显示我发布的整个字符串。

我尝试发布以下 Json:

{"posts":[ { "title":"asd", "slug": "asd", "body" : "asd" }, { "title":"qwe", "slug": "qwe", "body" : "qwe" }]}

现在的情况,我还没有发送cmets列表,因为我什至无法处理我没有尝试过的过程。

【问题讨论】:

    标签: python json rest flask


    【解决方案1】:

    好的,过了一会儿我想通了。

    我已经在 PostSerializer 上实现了 make_object,并为评论声明了一个序列化器,与帖子一样嵌套:

    class CommentsSerializer(Serializer):
        class Meta:
            fields = ("created_at", "body", "author")
    
    class PostSerializer(Serializer):
        id = fields.String()
        title = fields.String(required=True)
        comments = fields.Nested(CommentsSerializer, many=True)
    
        def make_object(self, data):
            return Post(**data)
    
        class Meta:
            additional = ("slug", "body", "created_at")
    

    然后,在 post 方法上,刚刚从烧瓶中获取 json,验证并序列化所有内容

    class PostViewList(Resource):
        def post(self):
            if not request.get_json():
                return bad_request('No input data provided')    
            content_input = request.get_json().get("posts")    
            serializer = PostSerializer(many=True)
            errors = serializer.validate(content_input)
            if errors:
                return jsonify(errors), 400    
            result = serializer.load(content_input)    
            r = Post.objects.insert(result.data)
            return PostSerializer(r, many=True).data, 201
    

    【讨论】:

    • 我能问你为什么使用validate,然后load load 只已经返回验证错误?你可以先data, errors = serializer.load(content_input) 然后if errors: abort(400, **errors)
    • 当时不知道,第一次玩Flask,不过感谢改进
    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 2014-01-10
    • 2021-08-04
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多