javascript - 使用 Flask 保存 HandsOnTable 数据

标签 javascript flask handsontable

我正在尝试从 HandsOnTable 加载和保存数据使用 flask 。我正在关注 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 View 函数的样子:

@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 调用发送到 View 函数的确切内容。有没有办法让我看到,这样我就可以更轻松地调试这样的问题?打印语句在 View 函数中似乎不起作用(我在控制台中看不到它们)。

非常感谢, 亚历克斯

更新根据 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)

flask :

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__'

最佳答案

这是一个很好的问题,到目前为止做得很好!现在,让我们从显而易见的事情开始。您正在使用 GET 请求向 Flask 发送数据,但您实际上是在尝试 POST 数据,这就是为什么 Python 在 request 中没有任何内容。如果我错了请纠正我,因为情况可能并非如此,但这是调试它的方法:

你应该在某个地方的 shell 上运行 flask。在这里您将看到任何 print 语句,因此,在 jsonSave() 中,在您定义它之后立即添加行 print data。此外,由于两个原因,您错误地检索了数据。首先语法如下:

jsonData = request.get_json()
data = jsonData["data"]

此外,如果您期望状态响应,那么使用 JSON 和 bool 值响应可能是值得的:

return json.dumps(True)

现在是前端。在将数据发送到服务器之前,只需将其打印到控制台即可。在 ajax 调用的正上方添加此行:

console.log(JSON.stringify({data: hot.getData()}));

这应该足以让您调试双方。看到并进行更改后,我建议您应该更好地了解问题所在,但如果没有,请使用您认为相关的输出更新您的问题(例如,如果 python 在尝试打印 data 时打印空行).

编辑:

能够以您设置路线的方式接收参数是不正确的。还有为什么你有 save.json ?相反,试试这个:

@app.route('/json/save/<well_id>', methods = ['GET', 'POST'])
@login_required
def jsonSave(well_id):
    jsonData = request.get_json()
    data = jsonData['data'] # this will fail if it is not a POST request
    print 'data:', data
    #Do stuff to load data into Database
    print 'saving', well_id
    return json.dumps(True)

在您的 ajax 调用中:

ajax('/json/save/{{well['id']}}', 'POST', JSON.stringify({data: hot.getData()}), function (res) {})

此外,请发布控制台日志和打印语句。我们在这里仍然一无所知。

关于javascript - 使用 Flask 保存 HandsOnTable 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040782/

相关文章:

javascript - 动态调整包含 Handsontable 的容器的大小

javascript - 如何在 Javascript 中将对象作为参数传递

javascript - bootstrap-wysihtml5 和 Bootstrap X-Editable textarea : editor buttons appearing with no styles or icons

flask - jinja2 - 显示不带括号/引号的项目

javascript - Fanytree Init 上的事件节点

javascript - 手动复制/粘贴隐藏数据

javascript - 回到滚动条末尾开始

javascript - 如何使用 $q 从 AngularJS 服务返回已解决的 promise ?

Flask、MongoEngine、WTForms - 表单渲染错误

javascript - 同步两个手持表的水平滚动