正在修改 Flask 中的 MongoDB 个数据
Modifying MongoDB data in flask
我是 运行 一个从 mongo 数据库获取数据的烧瓶服务器。
from flask import Flask
from flask import render_template
from pymongo import Connection
import json
from bson import json_util
from bson.json_util import dumps
app = Flask(__name__)
MONGODB_HOST = 'localhost'
MONGODB_PORT = 27017
DBS_NAME = 'donorschoose'
COLLECTION_NAME = 'projects'
FIELDS = {'school_state': True, 'resource_type': True, 'poverty_level': True, 'date_posted': True, 'total_donations': True, '_id': False}
@app.route("/")
def index():
return render_template("index.html")
@app.route("/donorschoose/projects")
def donorschoose_projects():
connection = Connection(MONGODB_HOST, MONGODB_PORT)
collection = connection[DBS_NAME][COLLECTION_NAME]
projects = collection.find(fields=FIELDS)
json_projects = []
for project in projects:
json_projects.append(project)
json_projects = json.dumps(json_projects, default=json_util.default)
connection.disconnect()
return json_projects
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000,debug=True)
我从网上得到了这段代码并成功实现了它。并通过此应用向 d3 应用提供数据。我的问题是:是否可以使用 python 在烧瓶环境中修改数据? (在我上面粘贴的代码中?)。我之所以问,是因为 python 比 d3 具有更大的灵活性,因为我在 d3 方面的专业知识较少。问题:'poverty-level' 列将有 4 个固定值,即低、中、高、未知。
我的目标是计算高贫困率的百分比
即对于列'poverty_level' -> count(val =high)/count(all rows)
基本上我只需要一列来显示我的指标,我很难做到这一点是 d3。任何 d3 或 python 级别的帮助将不胜感激:)
谢谢。
首先你需要完全迭代find()返回的Cursor:
projects = list(collection.find(fields=FIELDS))
然后计算项目总数和高贫困项目数:
high_poverty_count = len(p for p in projects if p['poverty_level'] == 'high')
high_poverty_ratio = float(high_poverty_count) / len(projects)
然后我会将其与所有项目的列表一起作为文档添加:
result = {'high_poverty_ratio': high_poverty_ratio,
'projects': projects}
return json.dumps(result, default=json_util.default)
另外,请注意您的应用程序有两个严重的问题:
首先,您使用 "Connection",即 obsolete。这样做:
from pymongo import MongoClient
client = MongoClient(MONGODB_HOST, MONGODB_PORT)
其次,您创建一个新客户端并为每个请求断开连接。这非常慢。相反,在您的应用程序开始时创建客户端,并且永远不要断开它:
client = MongoClient(MONGODB_HOST, MONGODB_PORT)
@app.route("/donorschoose/projects")
def donorschoose_projects():
collection = client[DBS_NAME][COLLECTION_NAME]
# ... etc ....
return json.dumps(result, default=json_util.default)
我是 运行 一个从 mongo 数据库获取数据的烧瓶服务器。
from flask import Flask
from flask import render_template
from pymongo import Connection
import json
from bson import json_util
from bson.json_util import dumps
app = Flask(__name__)
MONGODB_HOST = 'localhost'
MONGODB_PORT = 27017
DBS_NAME = 'donorschoose'
COLLECTION_NAME = 'projects'
FIELDS = {'school_state': True, 'resource_type': True, 'poverty_level': True, 'date_posted': True, 'total_donations': True, '_id': False}
@app.route("/")
def index():
return render_template("index.html")
@app.route("/donorschoose/projects")
def donorschoose_projects():
connection = Connection(MONGODB_HOST, MONGODB_PORT)
collection = connection[DBS_NAME][COLLECTION_NAME]
projects = collection.find(fields=FIELDS)
json_projects = []
for project in projects:
json_projects.append(project)
json_projects = json.dumps(json_projects, default=json_util.default)
connection.disconnect()
return json_projects
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000,debug=True)
我从网上得到了这段代码并成功实现了它。并通过此应用向 d3 应用提供数据。我的问题是:是否可以使用 python 在烧瓶环境中修改数据? (在我上面粘贴的代码中?)。我之所以问,是因为 python 比 d3 具有更大的灵活性,因为我在 d3 方面的专业知识较少。问题:'poverty-level' 列将有 4 个固定值,即低、中、高、未知。 我的目标是计算高贫困率的百分比 即对于列'poverty_level' -> count(val =high)/count(all rows)
基本上我只需要一列来显示我的指标,我很难做到这一点是 d3。任何 d3 或 python 级别的帮助将不胜感激:)
谢谢。
首先你需要完全迭代find()返回的Cursor:
projects = list(collection.find(fields=FIELDS))
然后计算项目总数和高贫困项目数:
high_poverty_count = len(p for p in projects if p['poverty_level'] == 'high')
high_poverty_ratio = float(high_poverty_count) / len(projects)
然后我会将其与所有项目的列表一起作为文档添加:
result = {'high_poverty_ratio': high_poverty_ratio,
'projects': projects}
return json.dumps(result, default=json_util.default)
另外,请注意您的应用程序有两个严重的问题:
首先,您使用 "Connection",即 obsolete。这样做:
from pymongo import MongoClient
client = MongoClient(MONGODB_HOST, MONGODB_PORT)
其次,您创建一个新客户端并为每个请求断开连接。这非常慢。相反,在您的应用程序开始时创建客户端,并且永远不要断开它:
client = MongoClient(MONGODB_HOST, MONGODB_PORT)
@app.route("/donorschoose/projects")
def donorschoose_projects():
collection = client[DBS_NAME][COLLECTION_NAME]
# ... etc ....
return json.dumps(result, default=json_util.default)