首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3 Flask & Sqlite3 -无法插入数据库

Python3 Flask & Sqlite3 -无法插入数据库
EN

Stack Overflow用户
提问于 2020-12-14 03:02:21
回答 1查看 136关注 0票数 0

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

下面是文件夹结构:

代码语言:javascript
复制
/
 application.py
 database.db

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

这是我的signup.py:

代码语言:javascript
复制
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

代码语言:javascript
复制
{% 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 %}

以下是我的控制台的输出:

代码语言:javascript
复制
* 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上

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-14 20:22:56

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

代码语言:javascript
复制
# And this is the named style:
cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})

您可以考虑“捕获”异常并向消息中添加更多信息,如下所示:

代码语言:javascript
复制
except Exception as e:
     print("Error in sign up operation: ",e)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65279488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档