嘿,有人能告诉我我的代码哪里做错了吗?我想检查数据库中是否有用户名。在
整个路线。它不会给我任何错误,但也不会填充我的数据库。在
@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()
首先,我想我有一个原始问题的工作代码示例。但是,我认为使用数据库中的约束可以更好地解决这个重复用户问题。看我答案的底部。在
首先让我们检查一下当前的代码。我在这里可以看到几个问题:
try/finally
的不正确缩进意味着在try/finally
期间没有活动的连接。在缩进
在当前代码中,第6行的
try/finally
块需要再缩进一个,以便能够使用第4行with
语句中建立的连接。在由于目前的代码,连接在使用时已经关闭,因此所有数据库访问都将失败。在
正在检查用户
用于检查用户的代码将失败,引发异常,导致finally命中并执行
rollback
。无论是否有任何条目,execute
的返回值在调用len
时抛出异常。在下面是我从python shell获得的信息,以说明我的意思:
相反,要检查
^{pr2}$select
语句是否返回值,请使用fetchone
并查看它是否返回None
:因此,我认为这样的方法可能会奏效:
替代方法
让用户承担更多的责任来防止数据库重复。在
创建表时生成
name
列unique
。然后插入一个具有相同用户名的记录将引发一个异常。以sqlite3 docs为例:做一个函数,谁检查用户名和电子邮件是否已经在数据库中。在
这段代码在第1行和第9行连接到
database.db
两次。可能这并不是最初的目的相关问题 更多 >
编程相关推荐