在Python / Flask中为d3.js异步加载数据

时间:2014-05-22 15:35:14

标签: python d3.js flask

我有一个python / flask应用程序。在其中我有一个页面,它对数据库进行了大量查询,以便在页面上显示数据。但是,如果我在@ app.route()所在的view.py中包含此逻辑,则加载页面需要的时间太长。然后我用d3显示这些数据。

我目前的设置是我从视图中有一个单独的路径来计算数据(假设“/ data”是路径)。当您转到该路径时,它以json格式返回数据并由

加载
d3.json("/data", callback)

这很好用。我的问题是我需要完成很多不同的查询,并且为每个数据集设置不同的路径会使我的应用程序混乱并且似乎没有遵循DRY原则。有一个更好的方法吗?我也很难将变量传递给从python运行d3的javascript。

1 个答案:

答案 0 :(得分:1)

您真正需要的是用于访问数据的API。如果您已经使用了烧瓶,那么Flask-Restful是一个很好的选择。您可以设置如下路线:

library(data.table)
d1 <-data.table(V1=sample(x, 100*length(x), replace=TRUE), 
                V2=rep(1:100,each=length(x)))[, 
      as.list(quantile(V1, probs=c(0.25, 0.5, 0.75,0.99))), by = V2]

然后您将能够使用JSON,查询字符串或表单传递指定所需数据的变量。 Flask-Restful很聪明,它会找出你用来自动发送它的方法。然后,您可以返回将使用JSON编码的字典。这应该解决您将多个变量传递回javascript的第二个问题。

相应的javascript示例如下:

from flask import Flask
from flask_restful import Resource, Api, reqparse

app = Flask(__name__)
api = Api(app)

class Data(Resource):
    def __init__(self):
        self.parser = reqparse.RequestParser()
        self.parser.add_argument('name', type=str, required = True)
        self.parser.add_argument('whatever', type=str, required = True)
    def post(self):
        args = self.parser.parse_args()
        #query your database here and do your stuff
        print(args['name'])
        print(args['whatever'])
        return {'data': 'your data here',
                'other_information': 'more_stuff' }
api.add_resource(Data, '/data')

if __name__ == '__main__':
    app.run(debug=True)