为什么我不能从AJAX POST到sqlite?

时间:2016-11-29 18:16:21

标签: javascript jquery ajax sqlite flask

我试图将本地保存功能合并到我的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

很抱歉,我不能在帖子中包含更多信息,但我甚至不确定我哪里出错或者我错过了什么,我添加了表格,因为我错误地将其从代码中删除了。

1 个答案:

答案 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)