Ric*_*ard 7 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)
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏,页面[0]是我无法使用的代码
TypeError:ObjectId('527e17c538320915e9893f17')不是JSON可序列化的
提前致谢
BTW不能推荐Miguel的大型教程作为开始构建内容的地方
zer*_*323 11
首先,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'}))
Run Code Online (Sandbox Code Playgroud)
或者你可以简单地_id通过电话删除page.pop('_id')
你也可以使用bson.json_util.它包含用于在BSON和JSON之间进行转换的工具.
from flask import Response
from bson import json_util
Run Code Online (Sandbox Code Playgroud)
然后jsonify用类似的东西替换:
return Response(
json_util.dumps({'page' : make_public_page(page)}),
mimetype='application/json'
)
Run Code Online (Sandbox Code Playgroud)
编辑
如果你想要简短而肮脏的方式处理问题,你可以这样做:
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19105 次 |
| 最近记录: |