Flask и Flask-login не сохраняются после перенаправленияPython

Программы на Python
Ответить
Anonymous
 Flask и Flask-login не сохраняются после перенаправления

Сообщение Anonymous »

Изменить: проблема была устранена путем добавления «учетных данных: «include»» к сообщению о регистрации во внешнем интерфейсе.
Я работаю над проектом, который включает в себя Серверная часть flask и интерфейс next.js. Когда я регистрируюсь, он успешно создает пользователя в базе данных и должен перенаправить на индексную страницу, но сеанс входа в систему теряется после перенаправления. Я пробовал много чего, но пока ничего не помогло.
Это мой файл аутентификации:

Код: Выделить всё

from flask import Blueprint, render_template, redirect, url_for, request, flash, jsonify, session
from flask_login import login_user, logout_user, current_user, login_required
from .models import User
from . import db, bcrypt, login_manager
from flask_login import LoginManager

auth = Blueprint('auth', __name__)

@auth.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
email = request.form.get('email')
password = request.form.get('password')
user = User.query.filter_by(email=email).first()
if user and bcrypt.check_password_hash(user.password, password):
login_user(user)
flash('Logged in successfully!', 'success')
return jsonify({'message': 'User Successfully logged In', 'username': email})
else:
flash('Login failed.  Check your credentials.', 'danger')
return jsonify({'message': 'None'})

@auth.route('/signup', methods=['POST'])
def signup():
if request.method == 'POST':
data = request.get_json()
email = data.get('email')
username = data.get('username')
password = data.get('password')
existing_user = User.query.filter_by(email=email).first()
if existing_user:
flash('Email already registered!', 'warning')
else:
hashed_password = bcrypt.generate_password_hash(password).decode('utf-8')
new_user = User(username=username, email=email, password=hashed_password)
db.session.add(new_user)
db.session.commit()
print(f'before session: {session}')
login_user(new_user)
print(f'after session: {session}')
flash('Account created!', 'success')
return jsonify({'message': 'User Successfully Created', 'username': username})
return jsonify({'message': 'None'})

@auth.route('/logout')
@login_required
def logout():
logout_user()
flash('Logged out successfully.', 'info')
return jsonify({'message': 'Logged out successfully'})

@auth.route('/api/login_state', methods=['GET'])
def login_state():
if current_user.is_authenticated:
return {'logged_in': True, 'username': current_user.username}
else:
return {'logged_in': False, 'username': ''}

# user_loader
@login_manager.user_loader
def load_user(user_id):
print(f"Loading user with ID: {user_id}")
return User.query.get(int(user_id))
А это моя лицевая страница:

Код: Выделить всё

import { useState, useEffect } from "react";
import styles from './SignUpForm.modules.css'

export default function SignUpForm() {
const [formData, setFormData] = useState({
email: '',
username: '',
password: '',
});

const [loginState, setLoginState] = useState({ logged_in: false, username: '' });

useEffect(() => {
const fetchLoginState = async () => {
try {
const response = await fetch('http://localhost:5000/api/login_state', {
method: 'GET',
credentials: 'include',
});

if (response.ok) {
const data = await response.json();
setLoginState(data);
} else {
console.error('Failed to fetch login state');
}
} catch (error) {
console.error('Error fetching login state:', error);
}
};

fetchLoginState();
}, []);

const handleChange = (e) => {
const { name, value } = e.target;
setFormData((prevData) => ({
...prevData,
[name]: value,
}));
};

const handleSubmit = async (e) => {
e.preventDefault();
document.querySelectorAll('input').forEach(input =>  input.classList.remove('error'));

let hasError = false;

if (!formData.email) {
document.getElementById('email').classList.add('error');
hasError = true;
}
if (!formData.username) {
document.getElementById('username').classList.add('error');
hasError = true;
}
if (!formData.password) {
document.getElementById('password').classList.add('error');
hasError = true;
}

if (hasError) {
alert("All fields are required!");
return;
}
try {
const response = await fetch('http://localhost:5000/signup', {
method: 'POST', // HTTP method
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(formData),
});

if (response.ok) {
const result = await response.json();
console.log(response)
console.log('Success:', result);
const resp2 = await fetch('http://localhost:5000/api/login_state', {
method: 'GET',
credentials: 'include'
});
const data2 = await resp2.json()
console.log('Login state before redirect: ', data2);
console.log(document.cookie)
window.location.href = '/';
} else {
console.error('Error:', response.status, response.statusText);
}
} catch (error) {
console.error('Network error:', error);
}
};

return (




Email


Username


Password







)
}
На вкладке сети браузера после отправки запроса я вижу, что вызовы API успешны для регистрации и возвращают файл cookie сеанса. Когда он перенаправляется на домашнюю страницу, он пытается проверить состояние входа в систему, но строка if current_user.is_authenticated по какой-то причине всегда возвращает False.
Это файл инициализации, который создает приложение для серверной части flask:

Код: Выделить всё

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from datetime import timedelta
from flask_cors import CORS

db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()

def create_app():
app = Flask(__name__)
app.config['SECRET_KEY'] = 'XXXXXX'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
CORS(app, supports_credentials=True, origins=['http://localhost:3000', 'http://127.0.0.1:5000'])  # Allow requests from your Next.js frontend

db.init_app(app)
bcrypt.init_app(app)
login_manager.init_app(app)

login_manager.login_view = 'auth.login'

from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint)

return app

Буду признателен за любую помощь. Я понятия не имею, что еще попробовать или почему пользователь возвращается как не аутентифицированный сразу после входа в систему. Я также заметил, что метод load_user по какой-то причине никогда не вызывается, хотя его должен вызывать метод login_user().< /п>

Подробнее здесь: https://stackoverflow.com/questions/792 ... r-redirect
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»