当前位置: 首页 > 面试题库 >

在FLASK和python中使用mongo

殳自怡
2023-03-14
问题内容

我正在尝试学习python,mongodb和flask,并使用了Miguel Grinberg的VERY EXCELLENT博客,他在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

提前致谢


问题答案:

首先find_one将返回单个字典,或者如果集合中没有匹配的元素,则返回None。所以我认为这page[0]等同于获取密钥的页面字典的价值0

如果返回的文档包含ObjectId_id则不能简单地使用,jsonify因为ObjectIdJSON不可序列化。你可以使用如下形式:

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

或者你可以_id通过致电简单地删除page.pop('_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))


 类似资料:
  • 问题内容: 我想在我的Flask应用程序中包含一个sass编译器。有一种普遍接受的方法吗? 问题答案: Flask-Assets扩展(使用webassets库)可以用于此目的。以下是将其配置为使用SCSS的pyScss编译器(在Python中实现)的方法: 并在模板中包括以下内容: SCSS文件也将在调试模式下进行编译。 pyScss只支持SCSS语法,但也有其他过滤器(,和)使用原始的Ruby实

  • 近些日子,使用基于文档的数据库而不是基于表的关系数据库变得越来越流行。 这一方案展示了如何使用文档映射库 MongoKit ,来与 MongoDB 交互。 这一方案的使用需要一个可用的 MongoDB 服务器,并且安装有 MongoKit 库。 使用 MongoKit 有两种常用的方法,我们将会逐一介绍: 显式调用 MongoKit 的默认行为是这种显式调用的方法。这种方法跟 Django 或者

  • 我正在尝试学习python、mongodb和flask,我正在使用Miguel Grinberg提供的非常优秀的博客,他在博客上提供了一套很棒的教程。米格尔格林伯格。通用域名格式 我有一个小的RESTful服务器工作正常,但现在想从mongo而不是mysql中提取东西 我可以使用下面的代码拉出mongo记录,但我很难让它呈现出来。 我在下面的代码中使用了箭头来显示我在哪里挣扎,我认为缺乏经验。任何

  • 问题内容: 我正在尝试在Flask框架下使用JQuery和Python进行长时间轮询。 在PHP中进行了长时间的轮询之后,我尝试以相同的方式进行处理: 具有while(true)循环的脚本/函数,定期检查更改,例如,数据库中每0.5秒更改一次,并在发生更改时返回一些数据。 因此,在我的ini .py文件中,我创建了一个到/ poll的app.route,以供JQuery调用。jQuery向其提供有

  • 问题内容: 有人可以在Flask中共享有关如何访问MySQL数据库的示例代码吗?已经有文档显示了如何连接到sqlite,但是没有连接到MySQL。 提前非常感谢你 问题答案:

  • 很多人更倾向于使用 SQLAlchemy 进行数据库操作。在这种情况下,建议您使用 包的而不是模块的方式组织您的应用代码,并将所有的模型放置到一个单独的模块中 (大型应用)。尽管这并非必要,但是这么做将会让程序的结构更加 明晰。 使用 SQLAlchemy 有四种常用的方法,我们在下面列出了这几种方法的基本使用 框架: Flask-SQLAlchemy 扩展 因为 SQLAlchemy 是一个常用