我正在努力学习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)
感谢您的帮助,[0]页是无法正常工作的代码,我收到了一封电子邮件
TypeError:ObjectId('527e17c538320915e9893f17')不可JSON序列化
提前谢谢
顺便说一句,米格尔的超级教程不足以作为开始制作东西的地方
您可以设置默认编码器:
或者可以将json.encoder.JSONEncoder子类化
从我在代码中看到的情况来看,您似乎没有使用Mongo自己的ID(存储在
_id
键中),而是生成了自己的整数ID,存储在id
键中。这是正确的吗代码的问题是Mongo
_id
键位于发送给make_public_page()
的dict
对象中,这些对象无法序列化为JSON您可以通过跳过键
_id
来解决此问题:作为补充说明,我认为最好不要发明自己的ID,而只使用Mongo的ID
首先
find_one
将返回单个字典,如果集合中没有匹配的元素,则返回None。所以我认为page[0]
相当于为键0
获取页面字典的值如果返回的文档包含
ObjectId
作为_id
,则不能简单地使用jsonify
,因为ObjectId
是不可JSON序列化的。 您可以使用以下内容:或者您可以通过调用
page.pop('_id')
简单地删除_id
您也可以使用^{} 。它包含用于BSON和JSON之间转换的工具
然后将
jsonify
替换为类似的内容:编辑
如果你想用简短而肮脏的方式处理问题,你可以这样做:
相关问题 更多 >
编程相关推荐