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

kev*_*son 6 python flask d3.js

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

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

d3.json("/data", callback)
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*nna 2

这里您真正需要的是用于访问数据的 API。如果您已经在使用 Flask,那么Flask-Restful是一个不错的选择。您可以像这样设置路线:

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)
Run Code Online (Sandbox Code Playgroud)

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

相应的 javascript 示例如下:

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://127.0.0.1:5000/data");
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.onload = function() {
    var dict = JSON.parse(xhr.responseText);
    console.log(dict['data']);
    console.log(dict['other_information']);
};

var request = JSON.stringify({'name':'my_name', 'whatever':'stuff'});
xhr.send(request);
Run Code Online (Sandbox Code Playgroud)