我正在尝试学习python、mongodb和flask,我正在使用Miguel Grinberg提供的非常优秀的博客,他在博客上提供了一套很棒的教程。米格尔格林伯格。通用域名格式
我有一个小的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序列化
提前感谢
顺便说一句,米格尔的超级教程不足以作为开始制作东西的地方
从我在代码中看到的情况来看,您似乎没有使用Mongo自己的id(存储在key\u id
中),而是生成自己的整数id,存储在keyid
中。这是正确的吗?
代码的问题是Mongo\u id
键位于发送到公开页面()
的dict
对象中,这些对象无法序列化为JSON。
您可以通过跳过键\u id
来解决此问题:
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)
elif field != '_id':
new_page[field] = page[field]
return new_page
作为补充说明,我认为最好不要发明自己的ID,而只使用Mongo的ID。
您可以设置默认编码器:
import json
from bson.objectid import ObjectId
def newEncoder(o):
if type(o) == ObjectId:
return str(o)
return o.__str__
....
return json.dumps(list(somecollection.find(expr)) , default=newEncoder )
或者可以将json子类化。编码器。杰森编码器
首先,find_one
将返回单个字典,如果集合中没有匹配的元素,则返回None。所以我认为page[0]
相当于获取键0
page字典的值
如果返回的文档包含ObjectId
作为\u id
,则不能简单地使用jsonify
,因为,likeObjectId
是不可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,并使用了Miguel Grinberg的VERY EXCELLENT博客,他在blog.miguelgrinberg.com上提供了很多教程 我有一个小型的RESTful服务器,可以正常工作,但现在想从mongo而不是mysql中提取内容 我可以使用下面的代码提取一条mongo记录,但正在努力使其呈现。 我在下面的代码中使用箭头来
问题内容: 我是Flask的忠实拥护者 -部分是因为它简单,部分是因为它具有很多扩展。但是,Flask是要在WSGI环境中使用的,并且WSGI不是非阻塞的,因此(我相信)对于某些类型的应用程序,它的伸缩性不如Tornado。 由于每个人都有一个将调用函数的URL调度程序,并且两个都将使用Python文件(在Django中,你不启动python文件,但在flask或Tornado中,你可以这样做)这
我创建了一个新的VS2012项目使用热毛巾模板,作为回报,使用Durandal,淘汰赛和微风。 我想使用jaydata而不是微风,对于ui层,我想使用出色的asKendoDataSource()功能来为kendoui网格供电。 我按照所有的指示,使kendoui工作良好的杜兰达尔。这很好。 我有一个模型,在这个模型中,我获取jaydata实体并在其上运行asKendoDataSource()。“我
问题内容: 我有一个Python专案,而导航/自动完成功能在专案中的档案内都能正常运作。我想指定一个virtualenv,以便导航/自动完成功能可以在该virtualenv中使用包。 我在settings.py中尝试了此操作,但导航/自动完成功能不起作用。也可以通过设置杀死原始导航/自动完成功能。 问题答案: 使用扩展的最新更新,您只需指定以下内容即可。 的值将在运行时确定,但是您仍然可以在其中自
在谷歌搜索了很多之后,现在感到困惑和沮丧。 我正在将一个应用程序从Hibernate 3升级到4。这在使用dtd 3.0时效果很好,但现在需要使用4.0 xsd,而这正是一切都要基于apex的地方! 该应用程序使用hbm.xml文件来配置每个实体,没有任何注释。 找到hbm文件的示例将非常有用,但即使是hibernate 4的教程也只使用3.0 dtd! 我正在使用以下内容 使用它,我得到了一个长
我目前正在使用Wink 1.1.1和Spring 3.1.2迁移一个Java应用程序从WAS7到WAS8.5.5。我正在尝试使用Wink 8.5中可用的本地Wink集成,而不是使用我们目前在Wink 7中使用的单独Wink罐。 我得到了一个错误的服务器启动,看起来像这样: 原因:java。lang.ClassNotFoundException:org。阿帕奇。眨眼服务器内部的登记处。java上的R