我試圖使用Flask加載和保存來自HandsOnTable的數據。我遵循these instructions用於使用ajax加載和保存(檢索和發送)數據。我已經設法從返回JSON字典的URL中將數據加載到表中,但我還沒有弄清楚如何發送數據存儲在我的數據庫中。使用Flask保存HandsOnTable數據
這裏是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],...]}
而且這裏是有關瓶視圖功能是什麼樣子:
@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'
w ^刪除不相關的部分。基本上我的問題是我如何使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)
調試輸出: 基本上,它看起來像瓶沒有加載一個JSON對象時,它調用jsonData = request.get_json()
。但是,console.log(JSON.stringify({data: hot.getData()}));
看起來不錯。
下面是瀏覽器和遊戲機瓶輸出:
瀏覽器:
{"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__'
非常感謝。我做了你的改變,但我仍然做錯了什麼。當我第一次加載頁面時,它給了我兩個錯誤,'GET http://127.0.0.1:5000/index.html 404(NOT FOUND)'和'Uncaught TypeError:無法讀取'null'屬性'querySelectorAll'。當我嘗試保存數據時,它說'GET http://127.0.0.1:5000/json/save.json/1 500(INTERNAL SERVER ERROR)'和'Uncaught SyntaxError:Unexpected token <'。這可能與樣品有關嗎?我從舊版本的HandsOnTable網站複製的js文件,因爲它不再被託管在那裏? –
我正在使用[this jsFiddle](http://jsfiddle.net/api/post/library/pure/)作爲參考,您可以在其中看到它包含''。該文件已不存在,但我從回機器獲得了一個歸檔版本並使用了該文件。不確定這是否會成爲一些問題的根源? –
好的,讓我們來看看。首先,從更新的問題,你做了兩件事情是錯誤的。一個是你的ajax調用仍在執行GET請求,所以第三個參數被忽略,第二,在你的Flask代碼中,你實際上沒有獲得任何參數,請參閱我的更新響應。 – ZekeDroid