Flask: как войти / выйти с помощью fetch API? - PullRequest
1 голос
/ 11 июля 2020

У меня есть следующие маршруты для входа / выхода и проверки статуса ведения журнала:

from flask_login import current_user, login_user, logout_user

@app.route('/check_login_status')
def check_login_status():
    return str(current_user.is_authenticated)
    
@app.route('/log_in')
def log_in():
    user = User.query.first()
    login_user(user)
    return 'OK'
    
@app.route('/log_out')
def log_out():
    logout_user()
    return 'OK'

Если я ввожу эти маршруты вручную в браузере, все работает, как ожидалось - пользователь входит / выходит и check_login_status возвращает правильное логическое значение.

Однако мне нужно получить доступ к этим маршрутам с помощью fetch API на внешнем интерфейсе следующим образом:

function login() {
    fetch('http://127.0.0.1:5000/log_in')
}
            
function logout() {
    fetch('http://127.0.0.1:5000/log_in')
}

Но вызов этих функций во внешнем интерфейсе ( при нажатии кнопки, например) не повлияет на статус входа в систему: ответ check_login_status route останется неизменным.

Почему это так и могу ли я это исправить?

1 Ответ

1 голос
/ 11 июля 2020

Прежде всего, в вашем маршруте входа

@app.route('/log_in')
def log_in():
user = User.query.first() // this is wrong .. you always login 
                          //with the first user in your database table 
login_user(user)
return 'OK'

..... поэтому сначала вам нужно указать метод публикации этого маршрута

@app.route('/log_in' , methods=['POST'])

, и вы получите учетные данные пользователя в теле запроса, например адрес электронной почты и пароль

user_data= request.get_json()

, затем запрос по электронной почте

user = User.query.filter_by(email=user_dat['email']).first()

, тогда вам нужно ввести sh пароль, входящий в запрос, и сравнить это к хешированному паролю пользователя, сохраненному в базе данных .. если они идентичны, то передайте его вашей функции login_user login_user (user)

/// java скрипт в запросе, вам нужно сделать это как это

function login() {
fetch('http://127.0.0.1:5000/log_in',{
method: "POST",
headers: {
  "Content-Type": "application/json",
},
body: JSON.stringify({email:'email@email.com',password:'password'}),}).then((res) => {
  return res.json();
}).catch((err) => {
  return err;
});

}

...