我试图将本地保存功能合并到我的Web App中,每次以任何形式发送数据时都会出现以下错误:
运行应用程序时,builtins.TypeError然后是/ SaveFile和jquery-3.1.1.js中的堆栈跟踪和9536 POST http://127.0.0.1:5000/SaveFile 500(内部服务器错误)在控制台日志中
我在下面的烧瓶中设置如下:
from flask import Flask, render_template, request
import sqlite3
import requests
from requests import Request
import json
DATABASE = 'data/data.db'
app = Flask(__name__)
db = sqlite3.connect(DATABASE)
cur = db.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS myrecipes(id INTEGER PRIMARY KEY, name TEXT, rating TEXT, author TEXT, source TEXT)")
db.commit()
@app.route('/')
def index():
return render_template("index.html")
@app.route('/SaveFile', methods=['POST', 'GET'])
def SaveFile(data):
if request.method == 'POST':
cur.execute('INSERT INTO myrecipes(name) VALUES(?)', json.stringify(data))
db.commit()
return render_template('SaveFile.html')
if __name__ == "__main__":
app.debug = True
app.run()
#j=requests.get(url)
AJAX功能:
function saveRecipe(title){
$.ajax({
type : "POST",
url : "/SaveFile",
data: { 'name': this.title },
success: function(data) {
console.log("correct");
},
error: function(err) { alert(err); }
});
}// Save end
很抱歉,我不能在帖子中包含更多信息,但我甚至不确定我哪里出错或者我错过了什么,我添加了表格,因为我错误地将其从代码中删除了。
答案 0 :(得分:1)
我在这里看到一些不正确的事情。您需要在AJAX方法中添加headers
行,才能将数据发送到Flask。您还需要JSON.stringify
要发送的对象:
function saveRecipe(title) {
$.ajax({
type: "POST",
headers: {"Content-Type": "application/json"},
url: "/SaveFile",
data: JSON.stringify({name: title}),
success: function(response) {
console.log(response);
},
error: function(response, error) {
console.log(response);
console.log(error);
}
});
}
在你的Flask端点中,你要求一个变量,这就是你得到500错误的原因,而不是必须通过request.data
对象访问数据。此外,对于此方法可能最好不要调用render_template
并将JSON返回到XHR方法,如下所示:
from Flask import jsonify
@app.route('/SaveFile', methods=['POST', 'GET'])
def SaveFile():
send_back = {"status": "failed"}
if request.method == 'POST':
try:
data = request.get_json()
cur.execute('INSERT INTO myrecipes(name) VALUES(?)', data["name"])
db.commit()
send_back["status"] = "success"
except Error as err:
send_back["status"] = str(err)
return jsonify(send_back)