我正在Kivy创建一个应用程序。我正在创建一个登录页面,允许用户输入密码和用户名,以验证他们以前是否使用过我的应用程序。我将用户名和密码存储在名为“users”的MySQL数据库中,该表称为“login”,用于将用户名和密码信息存储在两列中。我正在使用pymysql库与我的Python代码和MySQL数据库进行交互。
在我的Python代码中,我使用fetchall()方法从MySQL获取所有用户名和密码列和行,并将该数据存储在变量中。当我打印出那些数据时,我得到一个显示以下内容的字典列表:
[{'username': 'sample_username', 'password': 'sample_password'},
{'username': 'sample_username2', 'password': 'sample_password2'}]
正如您在MySQL中看到的,我创建了一些示例用户名和示例密码,当使用fetchall()方法时,它们存储在列表中的字典中。
接下来,我在Kivy创建了一个用户名的textinput框和一个textinput框 密码。我将用户输入存储在用户名和密码的变量中,如下所示:
self.username = self.ids.textinput_username.text
self.password = self.ids.textinput_username.text
然后在我使用fetchall()方法后,我检查用户输入的用户名和密码是否与我代码中已有的用户名或密码相匹配。
if self.username in results:
print("That username is stored")
if self.password in results:
print("That is a valid password")
但是,该代码根本没有返回任何内容。就好像Python不能 跟踪用户输入的用户名,无法检查是否在使用fetchall方法后得到的结果中。我甚至尝试将结果存储在列表中,然后要求Python检查用户名和密码字符串是否在列表中的任何位置。
login_list = []
for record in results:
login_list.append(record)
if self.username in login_list:
print("That username is valid")
if self.password in login_list:
print("That password is valid")
然而,当我输入时,我遇到同样的问题。 Python什么都不做,也不会执行条件语句。我连接到pymysql和我的MySQL数据库,并将我的所有登录信息存储在一个模块中并导入它。我知道我已正确连接,因为当我在列表中打印字典时,它会获取我存储在MySQL中的所有信息。以下是我的完整代码,减去导入:
class WelcomeScreen(Screen):
#A basic welcome screen. All of the functionality is in the .kv file
pass
class LoginScreen(Screen):
'''
Model a screen for the user to enter a username
and password.
'''
def store_username_password(self):
'''
get the username and password from textinput.
Check to see if the username and password is
stored in mysql database. If not, give the
user an error message
'''
#Create a variable to store the username entered in textinput
self.username = str(self.ids.textinput_username.text)
#Create a variable to store the password entered in textinput
self.password = str(self.ids.textinput_password.text)
#select the login table from the patient_support database
cur.execute("""SELECT * FROM login""")
#Use the fetchall method of the cursor object to get the info
results = cur.fetchall()
#If username and password entered in results, print statements
if self.username in results:
print("That is a valid username")
if self.password in results:
print("That is a valid password")
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("patientsupport.kv")
class PatientSupport(App):
def build(self):
return presentation
if __name__=='__main__':
PatientSupport().run()
答案 0 :(得分:1)
根据docs:
如果x 是s的成员 ,则
x in s
评估为True,否则为False。
records = [
{
'username': 'sample_username',
'password': 'sample_password'
},
{
'username': 'sample_username2',
'password': 'sample_password2'
}
]
records
的成员是两个dicts,但self.username是str。由于records
没有成员的str,因此self.username不能是in
记录列表。
相反,你需要做这样的事情:
for record in records:
if record["username"] == "sample_username":
print("That username is stored")
if record["password"] == "sample_password":
print("That is a valid password")
输出:
That username is stored
That is a valid password
(但请注意:该密码对该用户名无效)
要检查有效的用户名和匹配的密码,您需要执行以下操作:
for record in records:
if (record["username"] == "sample_username"
and record["password"] == "sample_password"):
print("Valid user!")
当你尝试这个时:
login_list = []
for record in results:
login_list.append(record)
您所做的就是将每个字典移动到另一个列表中,再次找不到str
类型in
dict
类型的列表。
如果你有这样的事情:
records = [
{
'username': 'sample_username',
'password': 'sample_password'
},
{
'username': 'sample_username2',
'password': 'sample_password2'
},
"some string"
]
然后你会看到输出'是':
if "some string" in records:
print("yes")
在这种情况下,三个记录成员是两个dict和一个str。
文档继续说:
in
测试字典是否有给定的密钥。
这意味着你可以这样写:
for record in records:
if 'username' in record:
print('yes')
--output:--
yes
yes
但这对你没有帮助。