python - MongoDB与Python,用于存储游戏的用户名和密码
问题描述
这是用户登录游戏的部分。该数据库托管在 mlab 上,有一个名为loginInfo
定义为的文档集合mycol
。
我面临的问题是,当它返回 id 时,我无法检查它是否是有效的,因为我无法检查 Python 中的任何类型的本地列表。我如何解决它?
import pymongo
def login():
print('Login\nRegister\nPlay as Guest')
login_input = input('What would you like to do?')
if login_input == 'Login':
username = input('Username:')
username_fromDB = mycol.find({"username": username})
if username_fromDB == username:
password = input('Password:')
password_fromDB = mycol.find({"password": password})
if password == password_fromDB:
print('Login success!\n')
mainMenu()
elif login_input == 'Register':
new_username = input('Username:')
new_password = input('Password:')
tobeaddedtodb = {"username": new_username, "password": new_password}
adding = mycol.insert_one(tobeaddedtodb)
print("Registered!\n")
elif login_input == 'Play as Guest':
mainMenu()
解决方案
username_fromDB = mycol.find({"username": username})
这是错误的,因为find()
返回的是游标对象,而不是您期望的用户名。
假设该loginInfo
集合包含唯一的用户名和各自的密码,则无需find()
对数据库进行 2 次查询。您可以只检索一个用户实体并检查输入提供的密码是否与存储在数据库中的密码匹配。
而且由于用户名是唯一的,因此您应该使用find_one()
而不是find()
. 如果用户被成功找到它返回dict
,否则你得到None
.
尝试这样的事情:
import pymongo
def login():
print('Login\nRegister\nPlay as Guest')
login_input = input('What would you like to do?')
if login_input == 'Login':
username_inp = input('Username:')
pwd_inp = input('Password:')
user_found = mycol.find_one({"username": username_inp}) # query by specified username
if user_found: # user exists
if pwd_inp == user_found['password']:
print('Login success!\n')
mainMenu()
else:
print('Wrong password')
else:
print('User not found')
elif login_input == 'Register':
new_username = input('Username:')
new_password = input('Password:')
tobeaddedtodb = {"username": new_username, "password": new_password}
adding = mycol.insert_one(tobeaddedtodb)
print("Registered!\n")
elif login_input == 'Play as Guest':
mainMenu()
推荐阅读
- c++ - 无法理解为什么返回值不会更新值
- python-3.x - TypeError:'NoneType' 对象在 opencv 中不可迭代
- javascript - 反应分享到社交网络预览图像?
- css - 为什么 Flexbox 在嵌套时不尊重宽度?
- django - 来自 github 的 Heroku Django 设置 install_requires
- docker - 具有进程隔离的 Windows 容器内的物理内存限制
- c - scanf 中 *variable 的用法以及我们为什么使用它?
- javascript - 如何获取特定 Discord 角色的名称?
- sql - 寻找出现更严重疾病的患者
- android - 暂停正在运行的协程