FLASK SQlite Python - 检查用户名是否已在数据库中

时间:2016-10-23 17:07:07

标签: python sqlite

嘿,有人能告诉我我的代码中出错了吗?我想检查用户名是否已经在数据库中。

整条路线。它不会给我任何错误但也不会填满我的数据库。

@app.route('/regist', methods=['GET', 'POST'])
def regist():
    if request.method == "POST":
        with sql.connect("database.db") as con:
            cur = con.cursor()
        try:
            # flash("register attempted")

            username = request.form['username']
            password = request.form['password']
            passwordencr = request.form['password']
            email = request.form['email']

            x = cur.execute("SELECT * FROM users WHERE name = ?", (username))

            if int(len(x)) > 0:
                flash("That username is already taken, please choose another")
                return render_template('register.html')
            else:
                cur.execute("INSERT INTO users (name,password,email) VALUES (?,?,?)",(username,passwordencr,email) )

                con.commit()
                flash ("Successfully registrated")
        except:
            con.rollback()
            msg = "error in insert operation"

        finally:
            session['logged_in'] = True
            session['username'] = username
            gc.collect()
            msg = Message('Hello', sender='yourId@gmail.com', recipients=[email])
            msg.body = "your username for ak047 is: %s and your password is %s" %(username,password)
            mail.send(msg)
            return render_template("home.html", msg=msg)
            con.close()
            gc.collect()

3 个答案:

答案 0 :(得分:3)

首先,我认为我有一个原始问题的工作代码示例。但是,我认为您可以使用数据库中的约束更好地解决此重复的用户问题。请参阅我的答案的底部。

首先让我们检查当前代码。我可以在这里看到几个问题:

  1. try/finally缩进不正确表示try/finally期间没有活动连接。
  2. 您检查用户名是否输入的方式不正确。
  3. 缩进

    在当前代码中,第6行的try/finally块需要进一步缩进,以便能够使用第4行with语句中建立的连接建立的连接。

    正如代码当前所示,连接将在其使用时关闭,因此所有数据库访问都将失败。

    正在检查用户

    用于检查用户的代码将失败,抛出异常将导致finally被命中并执行rollback。无论是否有条目,execute的返回值都会引发异常。

    这是我从python shell获得的内容,以显示我的意思:

    len

    相反,要检查>>> int(len(cur.execute("select * from people where name_last=:who", {"who": "mike"}))) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'sqlite3.Cursor' has no len() 语句是否返回值,请使用select并查看它是否返回fetchone

    None

    我认为这样的事情可能有用:

    # No users named `fred`:
    >>> cur.execute("select * from people where name_last=:who", {"who": "fred"}) 
    <sqlite3.Cursor object at 0x10bbd0180>
    >>> cur.fetchone() is None
    True
    
    # At least one user named `mike`:
    >>> cur.execute("select * from people where name_last=:who", {"who": "mike"})
    <sqlite3.Cursor object at 0x10bbd0180>
    >>> cur.fetchone() is None
    False
    

    替代方法

    更强大的方法是让数据库负责防止重复用户。

    创建表时创建def regist(): if request.method == "POST": with sql.connect("database.db") as con: cur = con.cursor() try: # ... Collecting form info ... cur.execute("SELECT * FROM users WHERE name = ?", (username)) if cur.fetchone() is not None: flash("That username is already taken...") return render_template('register.html') else: cur.execute("INSERT INTO users (name,password,email) VALUES (?,?,?)",(username,passwordencr,email) ) con.commit() flash (...) except: con.rollback() finally: session['logged_in'] = True session['username'] = username # ... mailing code ... name。然后插入具有相同用户名的记录将引发异常。以sqlite3 docs

    为例
    unique

答案 1 :(得分:0)

此代码在第1行和第9行连接database.db两次。可能这不是最初的意图

答案 2 :(得分:0)

制作一个功能,检查用户名和电子邮件是否已在数据库中。

#include <stdio.h>
#include <stdlib.h>
#include "tinymt64.h"

int main(void){
  int r;
  tinymt64_init(r,100)
  tinymt64_generate_uint64(r);
  return 0;
}