【问题标题】:Python3 Flask & Sqlite3 - Can't insert into databasePython3 Flask & Sqlite3 - 无法插入数据库
【发布时间】:2021-03-24 12:43:17
【问题描述】:

我无法让我的代码工作。我一直在寻找教程和指南,但无济于事。如果有人看到我正在做的错误,那将非常有帮助。

这是文件夹结构:

/
 application.py
 database.db

/routes
     __init__.py
     signup.py
    
/templates
     signup.html

这是我的 signup.py:

import sqlite3
from flask import Blueprint, render_template, redirect, session, request, flash
from werkzeug.exceptions import default_exceptions, HTTPException, InternalServerError
from werkzeug.security import check_password_hash, generate_password_hash

# Set Blueprints
signup = Blueprint('signup', __name__,)

@signup.route("/signup", methods=["GET", "POST"])
def signupFunction():

    # Forget any user_id
    session.clear()

    # User reached route via POST (as by submitting a form via POST)
    if request.method == "POST":

        try:
            email = request.form.get("email")
            username = request.form.get("username")
            password = request.form.get("password")
            confirmPassword  = request.form.get("confirm-password")

            with sqlite3.connect("./database") as connection:
                print("Opened database successfully")
                current = connection.cursor()

                # Ensure email was submitted
                if not email:
                    return flash("must provide email")
                # Ensure username was submitted
                if not username:
                    return flash("must provide username")

                # Ensure password was submitted
                if not password:
                    return flash("must provide password")

                # Ensure confirm password is correct
                if password != confirmPassword:
                    return flash("The passwords don't match")

                # Query database for username if already exists
                current.execute("SELECT * FROM users WHERE username = :username", username=username)
                if current.fetchall() == username: 
                    return flash("Username already taken")

                # Insert user and hash of the password into the table
                current.execute("INSERT INTO users(username, hash) VALUES (:username, :hash)", username=username, hash=generate_password_hash(password))
                current.commit()

                # Query database for username
                current.execute("SELECT * FROM users WHERE username = :username", username=username)
                rows = current.fetchall()

                # Remember which user has logged in
                session["user_id"] = rows[0]["id"]

                # Commit to databse
                connection.commit()

                print("Database operation succesful")
            
        except:
            connection.rollback()
            print("Error in sign up operation")
        
        finally:
            # Close database connection
            connection.close()
            # Redirect user to home page
            return redirect("/")

    # User reached route via GET (as by clicking a link or via redirect)
    else:
        return render_template("signup.html")

这是我的 signup.html

{% extends "layout.html" %}

{% block title %}
    Sign Up
{% endblock %}

{% block main %}
    <p>Register or <a href='/signin'>login</a></p><br>
    <form action="/signup" method="post">
        <div>
            <p>Username (6 characters min).</p>
            <input id="username" autocomplete="off" autofocus class="form-control" name="username" placeholder="Username" type="text">
        </div>
        <br>
        <div>
            <p>Email.</p>
            <input id="email" autocomplete="off" autofocus class="form-control" name="email" placeholder="Email" type="text">
        </div>
        <br>
        <div>
            <p>Password (7 to 15 characters, 1 numeric, 1 special).</p>
            <input id="password" name="password" placeholder="Password" type="password">
        </div>
        <div>
            <input id="confirm-pass" name="confirm-password" placeholder="Confirm Password" type="password">
        </div>
        <br>
        <button id="submit" type="submit">Sign Up</button>
        <br>
    </form>

    <script>
        // Password must be between 7 to 15 characters which contain at least one numeric digit and a special character
        document.querySelector("#submit").disabled = true;

        document.querySelector("#confirm-pass").onkeyup = function() {
            let password = document.querySelector("#password").value;
            let username = document.querySelector("#username").value;
            let email = document.querySelector("#email").value;
            let confirmation = document.querySelector("#confirm-pass").value;

            if (password.match(/^^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]{7,15}$/i)) {
                document.querySelector("#submit").disabled = true;
                if (email.match(/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i)) {
                    document.querySelector("#submit").disabled = true;
                    if (username.length > 5) {
                        document.querySelector("#submit").disabled = true;
                        if (confirmation === password) {
                            document.querySelector("#submit").disabled = false;
                        }
                    }
                }
            }
            else {
                document.querySelector('#submit').disabled = true;
            }
        }
    </script>
{% endblock %}

这是我的控制台的输出:

* Serving Flask app "application.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [13/Dec/2020 19:23:44] "GET /signup HTTP/1.1" 200 -
127.0.0.1 - - [13/Dec/2020 19:23:44] "GET /static/styles.css HTTP/1.1" 200 -
Opened database successfully
Error in sign up operation

所以问题在于signup.py

【问题讨论】:

  • 如果没有关于具体故障的更多信息,我的猜测是这个sqlite3.connect("./database"),因为根目录中没有名为database 的文件。
  • 抱歉,我似乎分心了……我正在编辑控制台的输出。我也尝试了sqlite3.connect("database"),但结果相同。

标签: python-3.x sqlite flask


【解决方案1】:

try/except 块对你没有任何好处。它可以在任何线路上出错,您只知道“注册操作出错”。由于无效的执行语法会出现问题。 execute 最多接受 2 个参数,第一个是要执行的 sql。如果它包含占位符,则第二个参数是一个集合。由于这些 sql 使用命名样式,因此第二个参数应该是字典,根据 the doc 中的示例。

# And this is the named style:
cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})

您可能会考虑“捕获”异常并向消息中添加更多信息,例如:

except Exception as e:
     print("Error in sign up operation: ",e)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2022-11-20
    • 2020-10-16
    相关资源
    最近更新 更多