Raj*_*ngh 5 python web.py pycharm
我正在尝试创建登录功能。但它只适用于那些。前 - 当我提供错误的用户名和密码时,在取消该消息并提供正确的用户名和密码后,我得到了正确的错误消息“无法登录”,然后我得到“pymysql.err.Error:已经关闭”,下面是示例代码.
import pymysql
# Connect to the database
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='python_code',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
class LoginModel:
def check_user(self, data):
try:
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT `username` FROM `users` WHERE `username`=%s"
cursor.execute(sql, (data.username))
user = cursor.fetchone()
print(user)
if user:
if (user, data.password):
return user
else:
return False
else:
return False
finally:
connection.close()
Run Code Online (Sandbox Code Playgroud)
您创建连接的次数(一次)和关闭连接的次数(每次登录尝试一次)不匹配。
一种解决方法是移动您的:
connection = pymysql.connect(host='localhost',
user='root',
password='',
db='python_code',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
Run Code Online (Sandbox Code Playgroud)
进入你的def check__user(). 它会起作用,因为您会在每次调用时创建并关闭连接(正如其他人指出的那样,该finally子句总是会被执行。)
这不是一个很好的设计,因为获取数据库连接往往相对昂贵。因此,首选保持在方法外部创建的连接......这意味着您必须删除connection.close()方法内的连接。
我认为你混淆connection.close()了cursor.close()。你想做后者,而不是前者。在您的示例中,您不必显式关闭光标,因为这会在您的with connection.cursor() as cursor:行中自动发生。
更改finally为except,或try完全删除该块。