#python #sqlite #flask
#python #sqlite #flask
Вопрос:
Я следую учебному пособию из практических руководств по веб-разработке Flask, чтобы поработать над идеями для моего итогового проекта по курсу компьютерного программирования. В настоящее время я застрял на молчащей ошибке, которая препятствует вставке записей в базу данных 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) в качестве сообщения об ошибке. Затем HTML-страница смогла вывести следующее сообщение об ошибке: «execute() не принимает аргумент ключевого слова» Онлайн-поиск заставил меня понять, что модуль sqlite3 поддерживает два вида заполнителей: вопросительные знаки (стиль qmark) и именованные заполнители (именованный стиль) https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.execute .
Изменив мои запросы select и insert в стиле 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)
Теперь придется решить новое сообщение об ошибке:
«Сеанс недоступен, поскольку секретный ключ не был установлен. Установите secret_key в приложении на что-то уникальное и секретное «.
Большое вам спасибо!
Ответ №1:
Происходит ли сбой в режиме ожидания, потому что регистр находится в «беззвучном» режиме? Поскольку register — это огромный try
блок, любое исключение будет return render_template("register.html", error = error)
и error
будет пустым. У вас нет шансов на победу. По крайней мере, отправить e
в register.html и получите больше обратной связи от компьютера. Это должно помочь вам в устранении неполадок.
Комментарии:
1. Большое вам спасибо @DinoCoderSaurus. Никогда этого не знал. В настоящее время на работе; буду реализовывать это, как только вернусь домой вечером и дам отзыв. Я очень благодарен.