嘿,有人能告诉我我的代码中出错了吗?我想检查用户名是否已经在数据库中。
整条路线。它不会给我任何错误但也不会填满我的数据库。
@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()
答案 0 :(得分:3)
首先,我认为我有一个原始问题的工作代码示例。但是,我认为您可以使用数据库中的约束更好地解决此重复的用户问题。请参阅我的答案的底部。
首先让我们检查当前代码。我可以在这里看到几个问题:
try/finally
缩进不正确表示try/finally
期间没有活动连接。缩进
在当前代码中,第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;
}