Невозможно вставить записи в базу данных Sqlite с помощью Flask

#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. Никогда этого не знал. В настоящее время на работе; буду реализовывать это, как только вернусь домой вечером и дам отзыв. Я очень благодарен.