【问题标题】:How to display an array of objects using python flask and mongoalchemy如何使用 python flask 和 mongoalchemy 显示对象数组
【发布时间】:2017-01-04 12:05:35
【问题描述】:

如何编写一个端点,它将为 mongoalchemy 返回一个 json 对象数组

我正在尝试如下所示:

@authenticate_bp.route('/users',methods=['GET'])
def user_list():
    users = [x.serialize for x in TokenBasedAuth.query.all()]
    return jsonify({'usersList': users})

架构如下图

    class TokenBasedAuth(db.Document):
    username = db.StringField()
    password = db.StringField()
    email = db.StringField()
    firstName = db.StringField()
    lastName = db.StringField()

def serialize(g):
    return {
        "_id" : str(g._id),
        "username" : g.username,
        "firstName" : g.firstName,
        "lastName" : g.lastName,
        "password" : g.password,
        "email" : g.email
    }

和db i中的数据如下图

{ 
    "_id" : ObjectId("586a0f01558b6728388161be"), 
    "username" : "sam", 
    "firstName" : "sam", 
    "lastName" : "123", 
    "password" : "123", 
    "email" : "email@123"
}

我收到如下所示的错误

AttributeError: 'TokenBasedAuth' 对象没有属性 'serialize' // Werkzeug 调试器

按预期工作的备用路线如下所示

@authenticate_bp.route('/users/list')
def users_listItr():
    try:
        users =  TokenBasedAuth.query.all()
        formatted_users=[]
        for user in users:
            print user
            formatted_users.append({
                'username':user.username,
                'password':user.password,
                'email':user.email,
                'firstName':user.firstName,
                'lastName':user.lastName

            })
        return json.dumps({'users':formatted_users}),
        200,{'Content-Type':'application/json'}

    except Exception,e:
        return jsonify(status='ERROR',message=str(e))

但这不是一个好主意,因为我正在尝试为一个架构构建 api,该架构可能包含数千个结构更复杂的文档,请建议一种解决方法

请帮助获取对象数组

【问题讨论】:

    标签: python arrays mongodb flask mongoalchemy


    【解决方案1】:

    我认为最简单的方法是在结果集上使用生成器,并使用函数将结果对象序列化为有效的 JSON:

    def serialize(row):
        return {
            "_id" : str(row._id),
            "username" : row.username,
            "firstName" : row.firstName,
            "lastName" : row.lastName,
            "password" : row.password,
            "email" : row.email
        } 
    
    @authenticate_bp.route('/users',methods=['GET'])
    def user_list():
        users = [serialize(x) for x in TokenBasedAuth.query.all()]
        return jsonify({'usersList': users})
    

    有一些方法可以尝试创建自定义 JSON 编码器:See this post。一般来说,我发现,对于 Flask,如果我需要 JSON 化某些东西,我需要坚持使用列表和字典,因为它更简单。

    【讨论】:

    • TypeError: is not JSON serializable 我得到同样的错误
    • 你需要“_id”字段吗?
    • 是的,我需要 _id 字段,这是我用作 unqiue 标识符的字段
    • 我试过这个 return json.dumps(json.loads(jsonpickle.encode(users)), indent=2) 但我得到了像 { "py/object": "app. model.authModel.TokenBasedAuth", "partial": false, "_Document__extra_fields_orig": {},}
    • k 如果不需要 _id 那我该怎么做请帮忙
    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2019-02-27
    相关资源
    最近更新 更多