Skip to main content
 首页 » 编程设计

python之带有 ObjectId 的 Marshmallow URLFor BuildError

2024年08月26日34lexus

如何使用 MongoEngine 和 Flask-Marshmallow 制作我的 RESTFul API HATEOAS?

我在用

class PraiaSerializer(ma.Schema):                                                                                                       
    id = ma.String()                                                                                                                    
    atividades = ma.Nested(AtividadeSerializer, many=True)                                                                              
 
    class Meta:                                                                                                                         
        additional = ('nome', 'descricao', '_links')                                                                                    
 
    _links = ma.Hyperlinks({                                                                                                            
        'self': ma.URLFor('praia_detail', id='<id>'),                                                                                   
        'collection': ma.URLFor('praias')                                                                                               
    })                

但是,当向我的路由发送请求时,marshmallow 会抛出一个 BuildError。

BuildError: ('atividade_detail', MultiDict([('id', ObjectId('55024fdfe138235aeac01380'))]), None) 

我该怎么办?

我是否向我的 ma.Hyperlinks 传递了错误的东西?

请您参考如下方法:

解决了我的问题!

我正在使用 Flask-RESTFul 编写我的 API,因此我必须使用端点名称注册我的路由。如果使用纯 Flask,请使用您的函数名称。

api.add_resource(PraiaListView, '/v1/praias', endpoint='praias_resource') 
api.add_resource(PraiaView, '/v1/praias/<id>', endpoint='praia_detail') 

并使用:

_links = ma.Hyperlinks({                                                                                                            
        'self': ma.URLFor('praia_detail', id='<id>'),                                                                                   
        'collection': ma.URLFor('praias_resource')                                                                                               
    })     

因此 marshmallow 可以为 _links 字段生成此输出:

"_links": { 
  "collection": "/v1/praias", 
  "self": "/v1/praias/55025029e138235aeac01383" 
},