因此,这里有一些用于简单用户登录的基本代码。
import tkinter as tk
import sqlite3
conn = sqlite3.connect("test")
cur = conn.cursor()
cur.execute("SELECT * FROM user_info")
all_rows = cur.fetchall()
usernames = []
passwords = []
for row in all_rows:
usernames.append(row[0])
passwords.append(row[1])
print(usernames)
print(passwords)
class loginApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self._frame = None
self.switch_frame(loginPage)
def switch_frame(self, frame_class):
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
def login_check(self, username, password):
x = username.get()
y = password.get()
login_check_bool = False
for i in range(len(usernames)):
if x is usernames[i] and y is passwords[i]:
login_check_bool = True
else:
self.switch_frame(badLogin)
print(x + y)
if login_check_bool is True:
self.switch_frame(goodLogin)
class loginPage(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
tk.Label(self, text="Login to the Application", font="Arial 20 bold").pack()
tk.Label(self, text="Username: ", font="Arial 15").pack()
ownUser = tk.Entry(self, width=24)
ownUser.pack()
tk.Label(self, text="Password: ", font="Arial 15").pack()
ownPass = tk.Entry(self, width=24, show="*")
ownPass.pack()
tk.Button(self, text="LOGIN", command=lambda: master.login_check(ownUser, ownPass)).pack()
class goodLogin(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
tk.Label(self, text="YOU'RE LOGGED IN!!!").pack()
tk.Button(self, text="RETRY", command=lambda: master.switch_frame(loginPage)).pack()
class badLogin(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
tk.Label(self, text="WRONG!!!").pack()
tk.Button(self, text="RETRY", command=lambda: master.switch_frame(loginPage)).pack()
if __name__ == "__main__":
app = loginApp()
app.mainloop()
似乎工作正常,但是,我有一个简单的问题。我似乎无法将从test-db获得的数据库值与密码和用户名值进行比较。如果我使用用户名为l且密码为l的测试登录名,则工作正常。有解决方案吗?
我还有一个sqlite配置,在test-db中有一个简单的表,该表具有用户名(varchar(24))和密码(varchar(24))。我不知道这与它不起作用有关。谢谢!
PS。打印语句仅供调试,对不起。
答案 0 :(得分:1)
“是”不是在Python中比较字符串的正确方法。
替换此行:
if x is usernames[i] and y is passwords[i]:
使用
if x == usernames[i] and y == passwords[i]:
您应该克服当前的不当行为(尽管设计中有足够多的问题,您可能在那里还有其他问题)
是什么?是。当两个操作数相同对象时,is
运算符仅产生True
。如果您在程序体中有一个硬编码的字符串,则可以使用特定于实现的优化来对该字符串进行内部化,并且与使用True
相比,它有可能产生is
-但是阅读那么从数据库中将不会触发此行为。
另一方面,==
运算符将比较实际的字符串内容-这是比较字符串或任何其他对象是否相等的正确方法。
其他问题? 好多首先,您将数据库的所有内容读取到两个搜索—毫不费力,不相关的内存结构,从那时起,诉诸于一种与Python或SQLite的搜索相比真正,非常“手动”的serch方法并比较功能。
也就是说,您将所有数据库登录名和密码放在两个单独的列表中。您可能只是通过login_check
中的登录名进行查询。如果查询没有返回结果,则您登录错误。如果返回单个结果,则继续比较同一行中的密码。对于这个应用程序来说,这显然是足够的设计。
从头开始学习安全性因此,您正在学习更多内容,并构建具有UI并处理数据库的应用程序-无需从现在开始就以正确的方式关注安全性和隐私性:如果您将普通密码记录到数据库中,如果它泄漏了,那将是您的主要不幸,也是所有用户的负担-(因为他们可能在其他地方重复使用相同的密码)-因此,无论何时存储密码,花点时间使用单向加密算法进行存储-比较密码时,您对键入的密码运行相同的单向算法,然后将该值与数据库中存储的值进行比较。如果买错了数据库的数据,则无法将编码后的密码恢复为纯文本。 Python在stdlib hashlib
模块中具有良好的单向加密算法。在那里看看。