[英]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.