簡體   English   中英

無法使用 Flask 將記錄插入 Sqlite 數據庫

[英]Unable to Insert Records into Sqlite Database with Flask

我正在關注實用 Flask Web 開發教程中的教程,以便為我的計算機編程課程期末項目研究想法。 我目前遇到一個靜默錯誤,該錯誤阻止將記錄插入 Sqlite 數據庫。 我已經在這個問題上大約兩天了。 該代碼似乎正在達到注冊表輸入驗證的級別。 flask 運行控制台中沒有錯誤日志。 我想將注冊表中的記錄插入數據庫用戶表中,並且還想知道為什么控制台沒有顯示錯誤的原因。 如果有人可以幫助解決這個神秘的錯誤,我將不勝感激。

這是我需要幫助的代碼的一小部分。


@app.route("/register/", methods = ["GET", "POST"])
def register():
    error = ""
    try:
        # error = ""
        cursor, conn = connection()

        if request.method == "POST":

            # Check that all fields are filled
            if not request.form.get("firstname"):
                error = "Please provide firstname!"
                return render_template("register.html", error = error)

            if not request.form.get("surname"):
                error = "Please provide surname!"
                return render_template("register.html", error = error)

            if not request.form.get("username"):
                error = "Please provide username!"
                return render_template("register.html", error = error)

            if not request.form.get("password"):
                error = "Please provide provide!"
                return render_template("register.html", error = error)

            if not request.form.get("confirmation"):
                error = "Please provide password confirmation!"
                return render_template("register.html", error = error)

            # Validate matching passwords
            if request.form.get("password") != request.form.get("confirmation"):
                error = "Please provide matching passwords!"
                return render_template("register.html", error = error)


            if not request.form.get("email"):
                error = "Please provide email!"
                return render_template("register.html", error = error)

            if not request.form.get("age"):
                error = "Please provide age!"
                return render_template("register.html", error = error)

            if not request.form.get("birthday"):
                error = "Please provide birthday!"
                return render_template("register.html", error = error)

            print("All fields entered.")

            prior_username = cursor.execute("SELECT * FROM users WHERE username = :username", username = request.form.get("username"))
            if len(prior_username) > 0:
                error = "Invalid username; choose a different one!"
                return render_template("register.html", error = error)
            else:
                firstname = request.form.get("firstname")
                surname = request.form.get("surname")
                username = request.form.get("username")
                password = request.form.get("password")
                confirmation = request.form.get("confirmation")
                email = request.form.get("email")
                age = request.form.get("age")
                birthday = request.form.get("birthday")
                tracking = "/introduction-to-python-programming/"
                rank = 0

                hash_pass = generate_password_hash(request.form.get("password"))
                new_user = cursor.execute("""INSERT INTO users
                    (firstname, surname, username, hash, email, age, birthday, tracking, rank)
                    VALUES (:firstname, :surname, :username, :hash_pass, :email, :age, :birthday, :tracking, :rank)
                """, firstname, surname, username, hash_pass, email, age, birthday, tracking, rank)
                print("Insertion success")
                conn.commit()
                print("Commit success")
                conn.close()
                gc.collect()

                session["logged_in"] = True
                session["username"] = new_user
                return redirect(url_for("dashboard"))
        return render_template("register.html", error = error)
    except Exception as e:
        return render_template("register.html", error = error)



if __name__ == "__main__":
    app.jinja_env.auto_reload = True
    app.config["TEMPLATES_AUTO_RELOAD"] = True
    app.run(debug = True)

這是注冊HTML文件代碼:

{% extends "layout.html" %}

{% block title %}
    Register
{% endblock %}

{% block main %}
    <div class="container">
        <h4>Please Register</h4>
        {% if error %}
            <p><strong>{{ error }}</strong></p>
        {% endif %}
        <form action="{{ url_for("register") }}" method="POST" class="form-group">
            <div class="msg2"></div>
            <div>
                <label for="firstname">First Name</label>
                <input type="text" name="firstname" id="firstname" placeholder="Enter first name">
            </div>
            <br>
            <div>
                <label for="surname">Surname</label>
                <input type="text" name="surname" id="surname" placeholder="Enter surname">
            </div>
            <br>
            <div>
                <label for="username">Username</label>
                <input type="text" name="username" id="username" placeholder="Enter username">
            </div>
            <br>
            <div>
                <label for="password">Password</label>
                <input type="password" name="password" id="password" placeholder="Enter password">
            </div>
            <br>
            <div>
                <label for="password">Confirmation</label>
                <input type="password" name="confirmation" id="confirmation" placeholder="Confirm password">
            </div>
            <br>
            <div>
                <label for="email">Email</label>
                <input type="email" name="email" id="email" placeholder="Enter email address">
            </div>
            <br>
            <div>
                <label for="age">Age</label>
                <input type="number" name="age" id="age" placeholder="Enter current age">
            </div>
            <br>
            <div>
                <label for="birthday">Birthday</label>
                <input type="date" name="birthday" id="birthday">
            </div>
            <br>
            <button type="submit" class="btn btn-primary">Register</button>
        </form>
        {% if error %}
            <p><strong>{{ error }}</strong></p>
        {% endif %}
    </div>
{% endblock %}

先感謝您。

============================================

編輯

按照@DinoCoderSaurus 的建議,我修改了我的代碼以將 (e) 作為錯誤消息傳遞。 The HTML page was then able to output the following error message: "execute() takes no keyword argument" Online search made me realise that sqlite3 module supports two kinds of placeholders: question marks (qmark style) and named placeholders (named style) https ://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.execute

通過修改我的 select 並將查詢插入 qmark 樣式,我能夠將記錄插入數據庫。

這是修改后的代碼:


@app.route("/register/", methods = ["GET", "POST"])
def register():
    error = ""
    try:
        # error = ""
        cursor, conn = connection()

        if request.method == "POST":

            # Check that all fields are filled
            if not request.form.get("firstname"):
                error = "Please provide firstname!"
                return render_template("register.html", error = error)

            if not request.form.get("surname"):
                error = "Please provide surname!"
                return render_template("register.html", error = error)

            if not request.form.get("username"):
                error = "Please provide username!"
                return render_template("register.html", error = error)

            if not request.form.get("password"):
                error = "Please provide provide!"
                return render_template("register.html", error = error)

            if not request.form.get("confirmation"):
                error = "Please provide password confirmation!"
                return render_template("register.html", error = error)

            # Validate matching passwords
            if request.form.get("password") != request.form.get("confirmation"):
                error = "Please provide matching passwords!"
                return render_template("register.html", error = error)


            if not request.form.get("email"):
                error = "Please provide email!"
                return render_template("register.html", error = error)

            if not request.form.get("age"):
                error = "Please provide age!"
                return render_template("register.html", error = error)

            if not request.form.get("birthday"):
                error = "Please provide birthday!"
                return render_template("register.html", error = error)

            print("All fields entered.")

            username = request.form.get("username")
            # prior_username = cursor.execute("SELECT * FROM users WHERE username = ?", username)
            cursor.execute("SELECT * FROM users WHERE username = ?", username)
            # print(cursor.fetchone())
            prior_username = cursor.fetchall()
            # conn.commit()
            if len(prior_username) > 0:
                error = "Invalid username; choose a different one!"
                return render_template("register.html", error = error)
            else:
                firstname = request.form.get("firstname")
                surname = request.form.get("surname")
                username = request.form.get("username")
                password = request.form.get("password")
                confirmation = request.form.get("confirmation")
                email = request.form.get("email")
                age = request.form.get("age")
                birthday = request.form.get("birthday")
                tracking = "/introduction-to-python-programming/"
                rank = 0

                hash_pass = generate_password_hash(request.form.get("password"))
                new_user = cursor.execute("""INSERT INTO users
                    (firstname, surname, username, hash, email, age, birthday, tracking, rank)
                    VALUES (:firstname, :surname, :username, :hash_pass, :email, :age, :birthday, :tracking, :rank)
                """, (firstname, surname, username, hash_pass, email, age, birthday, tracking, rank,))
                print("Insertion success")
                conn.commit()
                print("Commit success")
                conn.close()
                gc.collect()

                session["logged_in"] = True
                session["username"] = new_user
                return redirect(url_for("dashboard"))
        return render_template("register.html", error = error)
    except Exception as e:
        return render_template("register.html", error = e)

現在必須解決新的錯誤消息:“session 不可用,因為未設置密鑰。將應用程序上的 secret_key 設置為唯一且機密的內容。”

非常感謝!

是否因為寄存器處於“靜默”模式而靜默失敗? 由於 register 是一個巨大的try塊,任何Exception 都會return render_template("register.html", error = error)並且error將為空白。 你沒有戰斗的機會。 至少發送e到 register.html 並從計算機獲得更多反饋。 這應該可以幫助您進行故障排除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM