MongoDB с Python, используется для хранения имени пользователя и паролей к игре

1

Это та часть, в которой пользователь входит в игру. База данных размещается на 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
    Под валидацией я имел в виду, что если имя пользователя не существует, я бы попросил пользователя зарегистрироваться, и это также помогает найти пароль, связанный с именем пользователя.
Теги:
pymongo-3.x

1 ответ

0
Лучший ответ
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()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню