MongoDB с Python, используется для хранения имени пользователя и паролей к игре - PullRequest
0 голосов
/ 22 октября 2018

Это часть, где пользователь входит в игру.База данных размещена на mlab, есть коллекция документов с именем loginInfo, определенная как mycol.

Проблема, с которой я сталкиваюсь, заключается в том, что когда он возвращает идентификатор, у меня нет возможности проверить, является ли он действительным, поскольку я не смог бы проверить ни с каким локальным списком в 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()

1 Ответ

0 голосов
/ 22 октября 2018
username_fromDB = mycol.find({"username": username})

Это неправильно, потому что find() возвращает объект-курсор, а не имя пользователя, как вы ожидаете.


Если предположить, что коллекция loginInfo содержит уникальные имена пользователей и соответствующие пароли, в этом нет необходимостисделать 2 find() запросов к базе данных.Вы можете просто извлечь объект пользователя и проверить, соответствует ли введенный пароль паролю, сохраненному в базе данных.

И поскольку имена пользователей уникальны, вы должны использовать 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()
...