2015-02-06 70 views
1

我正在運行一個燒瓶服務器,它從mongo數據庫中提取數據。修改燒瓶中的MongoDB數據

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方面的專業知識較少。問題:「貧困水平」欄目將有4個固定值,即低,中,高,未知。 我的目的是計算高度貧窮 的即對於column'poverty_level」的百分比 - >計數(VAL =高)/數(所有行)

基本上我只需要一個列中顯示我的公制和我有一個艱難的時間這樣做是D3。任何D3或蟒蛇級別的幫助將不勝感激:)

謝謝。

回答

2

首先,你需要完全循環()的返回找到光標:

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) 

另請注意,y我們的應用程序有兩個嚴重的問題:

首先,您使用「連接」,這是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)