Как сделать простой логин без базы данных и без формы

Я хочу добавить простую функцию входа в систему, в которой можно либо войти в систему, либо не войти в нее (нет необходимости сохранять данные, специфичные для пользователя).

Я сделал класс пользователя:

class User(object):
def __init__(self, username, hash):
    self.name = username
    self.hash = hash

и я загружаю список пользователей из файла INI.

Я реализовал функцию user_loader

@self.login_manager.user_loader
    def load_user(userid):
        for user in self.users:
            if user.name == userid
                return user
        return None

Что происходит в методе входа?

@self.server.route("api/login", methods=["GET", "POST"])
        def login():

Я хочу выполнить вход с помощью запроса ajax, в котором я отправляю учетные данные и получаю ответ JSON, содержащий имя пользователя или сообщение об ошибке.


person Toast    schedule 17.08.2014    source источник


Ответы (1)


Простой пример, который будет работать с POST /api/login с данными username=TEST_USER&hash=TEST_HASH или GET /api/login?username=TEST_USER&hash=TEST_HASH:

class User(UserMixin):

    def __init__(self, username, hash):
        self.name = username
        self.hash = hash

    @property
    def id(self):
        return self.name


@self.server.route('/api/login', methods=['GET', 'POST'])
def login():
    user = load_user(request.values.get('username'))
    if user and user.hash == request.values.get('hash'):
        login_user(user)
        return jsonify(status='ok', username=user.username)
    else:
        return jsonify(status='error', message='wrong username or hash')

Однако я предпочитаю только метод POST http для входа в систему.

На самом деле ваша собственная реализация будет зависеть от вашего вызова js, например, вы можете использовать request.get_json вместо POST request.form или GET request.args. И алгоритм входа в систему (поля учетных данных).

Также load_user может быть медленным с большим количеством users.

person tbicr    schedule 18.08.2014
comment
Спасибо, это работает. Но current_user.is_authenticated() по-прежнему возвращает false во всех функциях, кроме функции входа в систему. Как я могу получить доступ к пользователю? - person Toast; 19.08.2014
comment
У вас есть user_id в сеансе после входа в систему? - person tbicr; 19.08.2014
comment
Только внутри функции входа. Везде выдает KeyError. - person Toast; 19.08.2014
comment
Если вы используете сохранение сеанса по умолчанию в файлах cookie, возможно, ваши файлы cookie отключены. - person tbicr; 20.08.2014
comment
Я ничего не менял на сервере фляги, и мой браузер разрешает файлы cookie. - person Toast; 20.08.2014
comment
Возможно, у вас есть несколько ajax-запросов одновременно с логином, которые могут переопределять файлы cookie. Однако трудно помочь больше без дополнительной информации. - person tbicr; 20.08.2014
comment
Да, у меня в любое время работает запрос ajax. Есть ли способ обойти это? Я также могу опубликовать свой код, если хотите. - person Toast; 20.08.2014
comment
Я имею в виду состояние гонки, когда вы отправляете несколько ajax-запросов одновременно: первый запрос устанавливает cookie, а второй может переопределить cookie. - person tbicr; 20.08.2014
comment
Я делаю один запрос ajax, который спрашивает, изменилось ли что-то на сервере. Он будет работать до десяти секунд. Если пользователь вошел в систему, на первоначальный запрос статуса будет дан ответ, и пользователь не войдет в систему. Но когда клиентский веб-сайт выполняет другой запрос статуса, пользователь все еще не вошел в систему. - person Toast; 20.08.2014