【发布时间】:2015-07-14 11:13:16
【问题描述】:
我正在尝试使用 Flask 从HandsOnTable 加载和保存数据。我正在关注 these instructions 使用 ajax 加载和保存(检索和发送)数据。我已经设法从返回 JSON 字典的 URL 将数据加载到表中,但我还没有弄清楚如何发送数据并存储在我的数据库中。
以下是 javascript 的相关部分:
Handsontable.Dom.addEvent(save, 'click', function() {
// save all cell's data
ajax('/json/save.json', 'GET', JSON.stringify({data: hot.getData()}), function (res) {
var response = JSON.parse(res.response);
if (response.result === 'ok') {
exampleConsole.innerText = 'Data saved';
}
else {
exampleConsole.innerText = 'Save error';
}
});
});
希望这是从 HandsOnTable 中获取数据,将其转换为这种格式的大型 JSON 表:
{'data' : [[row 1], [row 2],...]}
下面是相关的 Flask 视图函数的样子:
@app.route('/json/save.json', methods = ['GET', 'POST'])
@login_required
def jsonSave():
data = request.form['data']
#Do stuff to load data into database
return 'ok'
删除了不相关的部分。基本上我的问题是如何使保存功能的data = request.form['data'] 部分工作,并将其变成一个简单的行列表?
顺便说一句,这很困难的部分原因是我无法看到通过 ajax 调用发送到视图函数的确切内容。有没有办法让我可以更轻松地调试这样的问题?打印语句似乎在视图函数中不起作用(我在控制台中看不到它们)。
非常感谢, 亚历克斯
更新(再次)按照 ZekeDroid 的说明更改为:
Handsontable.Dom.addEvent(save, 'click', function() {
// save all cell's data
console.log(JSON.stringify({data: hot.getData()}));
ajax('/json/save/{{well['id']}}', 'POST', JSON.stringify({data: hot.getData()}), function (res) {
var response = JSON.parse(res.response);
if (response.result === 'ok') {
exampleConsole.innerText = 'Data saved';
}
else {
exampleConsole.innerText = 'Save error';
}
});
});
和
@app.route('/json/save/<int:well_id>', methods = ['GET', 'POST'])
@login_required
def jsonSave(well_id):
jsonData = request.get_json()
print 'jsonData:', jsonData
data = jsonData['data']
print 'data:', data
#Insert table into database
print 'saving', well_id
return json.dumps(True)
调试输出:
基本上,看起来 Flask 在调用jsonData = request.get_json() 时没有加载 json 对象。不过,console.log(JSON.stringify({data: hot.getData()})); 看起来还不错。
这是浏览器和 Flask 控制台的输出:
浏览器:
{"data":[["01/01/15",100,300,200,96],["01/02/15",200,500,300,50],["01/03/15",300,600,400,80],["01/01/15",100,300,200,96],["01/02/15",200,500,300,50],["01/03/15",300,600,400,80],["01/01/15",100,300,200,96],["01/02/15",200,500,300,50],["01/03/15",300,600,400,80],[null,null,null,null,null]]}
samples.js:94 POST http://127.0.0.1:5000/json/save/1 500 (INTERNAL SERVER ERROR)
烧瓶:
jsonData: None
127.0.0.1 - - [13/May/2015 11:41:31] "POST /json/save/1 HTTP/1.1" 500 -
Traceback (most recent call last):
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1836, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1817, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1475, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask\app.py", line
1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\aschmitt\Envs\PetroTools\lib\site-packages\flask_login.py", lin
e 758, in decorated_view
return func(*args, **kwargs)
File "C:\Users\aschmitt\Dropbox\Python\PetroTools\app\views.py", line 236, in
jsonSave
data = jsonData['data']
TypeError: 'NoneType' object has no attribute '__getitem__'
【问题讨论】:
标签: javascript flask handsontable