python - 将 mongodb 与 FLASK 和 python 一起使用

标签 python mongodb flask

我正在尝试学习 python、mongodb 和 flask ,并且正在使用 Miguel Grinberg 的非常优秀的博客,他在 blog.miguelgrinberg.com 上提供了一组很棒的教程

我有一个小型 RESTful 服务器工作正常,但现在想从 mongo 而不是 mysql 中提取内容

我可以使用下面的代码拉出一个 mongo 记录,但我很难让它呈现。

我在下面的代码中使用了箭头来显示我在哪里挣扎,我认为缺乏经验。任何想法将不胜感激。

#!flask/bin/python
from flask import Flask, jsonify, abort, make_response, url_for
from pymongo import MongoClient

# connect to mongo database hosted on AWS
# the script expects the host name to be in  /etc/hosts file

'''
Set up global variables here
'''
mongo_server = "mongo_api"
mongo_port = "27017"
mongo_user = "admin"
mongo_passwd = ":mysecretpassword@"
connect_string = "mongodb://"+ mongo_user 
                             + mongo_passwd 
                             + mongo_server 
                             + ":" 
                             + mongo_port

app = Flask(__name__)

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify( { 'error': 'Notfound' } ), 404)


def make_public_page(page):
    new_page = {}
    for field in page:
        if field == 'id':
            new_page['uri'] = url_for('get_page', page_id = page['id'], _external = True)
        else:
            new_page[field] = page[field]
    return new_page



@app.route('/api/v1.0/pages/<int:page_id>',methods = ['GET'])
def get_page(page_id):
    '''
    Can connect otherwise exit with message
    '''
    try:
        connection = MongoClient(connect_string)    # equal to > show dbs
    except:
        exit("Error: Unable to connect to the database") # exit with an error
    '''
    connect to database and pull back collections
    '''
    db = connection.test_database # equal to > use test_database                
    pages = db.pages
    page = pages.find_one({"id": int(page_id)})   <------ this pulls back a document
    if page == None:  <---- if a null set comes back then this works great
        abort(404)
    return jsonify( { 'page' : make_public_page(page[0])} ) <- error says its not json

if __name__ == '__main__':
    app.run(debug = True)

感谢任何帮助,page[0] 是无法正常工作的代码,我得到了

TypeError: ObjectId('527e17c538320915e9893f17') 不是 JSON 可序列化的

提前致谢

顺便说一句,不能推荐 Miguel 的大型教程作为开始构建东西的地方

最佳答案

首先 find_one 将返回单个字典或 None 如果集合中没有匹配的元素。所以我认为 page[0] 相当于获取键 0

的页面字典的值

如果返回的文档包含 ObjectId 作为 _id 你不能简单地使用 jsonify 因为像 ObjectId 不是 JSON可序列化的。 你可以使用这样的东西:

jsonify({ 'page': make_public_page({k:v for k, v in page.items() if k != '_id'}))

或者您可以通过调用 page.pop('_id')

来简单地删除 _id

您也可以使用bson.json_util .它包含用于在 BSON 和 JSON 之间进行转换的工具。

from flask import Response 
from bson import json_util

然后将 jsonify 替换为类似这样的内容:

return Response(
    json_util.dumps({'page' : make_public_page(page)}),
    mimetype='application/json'
)

编辑

如果你想用简短而肮脏的方式来处理问题,你可以这样做:

from bson import json_util, ObjectId
import json

#Lets create some dummy document to prove it will work
page = {'foo': ObjectId(), 'bar': [ObjectId(), ObjectId()]}

#Dump loaded BSON to valid JSON string and reload it as dict
page_sanitized = json.loads(json_util.dumps(page))

关于python - 将 mongodb 与 FLASK 和 python 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19877903/

相关文章:

python - 什么是 yy-mm-dd'D' 格式?

python - 当 SSL SYSCALL 错误和 CONN_MAX_AGE > 0 时强制建立新的数据库连接

java - java如何解释unix时间戳?

node.js - 在 MongoDB 中的多个字段上使用 $in

python - 混淆矩阵错误 "Classification metrics can' t 处理多标签指示符和多类目标的混合”

python - 将 Torchvision ImageFolder 与测试集结合使用

mongodb - 我将如何在 MongoDB 中设计这个模式?

python - Flask 中的通用端点

python - Flask 请求 : determine exact path, 包括是否有问号

flask - 在大型应用程序中使用 Flask Restful 作为蓝图