Объект сессии во Flask обнуляется при запросе с ReactJS, но не ведет себя так при запросах из Postman
На сервере имеется такой конфиг:
from uuid import uuid4
import redis
from datetime import timedelta
class AppConfig:
JWT_SECERT_KEY = uuid4().hex
SECRET_KEY = uuid4().hex
SESSION_TYPE = 'redis'
SESSION_PERMANENT = False
PERMANENT_SESSION_LIFETIME = timedelta(hours=12)
SESSION_USE_SIGNER = True
SESSION_REDIS = redis.from_url("redis://127.0.0.1:6379")
Функция, работающая после запроса, которая печатает содержимое объекта session
@app.after_request
def close_connect(resp):
print(session)
my_db.close_connection()
print(f"Connection is closed, response is {resp}", end='\n\n')
return resp
И такая роут для логина, где my_db - это экземпляр пользовательского класса для связи с PostgresSQL:
from flask import Flask, request, jsonify, session
from flask_jwt_extended import create_access_token
@app.route('/login', methods=['POST'])
def login_user():
data = json.loads(request.data)
email, password = data['email'], data['password']
user = my_db.get_user_by_email(email)
if not user:
return jsonify({
'Error': 'User do not exists',
}), 401
if check_password_hash(user.password, password):
res = {
'id': user.id,
'email': user.email
}
if str(user.id) not in session:
token = create_access_token(res)
session[str(user.id)] = uuid4().hex
return jsonify(access_token=token), 200
return jsonify({'error': 'Already authorized'})
return jsonify({
'Error': 'Wrong password or email',
}), 401
Если передать через Postman двумя последовательными запросами на .../login такие JSON'ы:
{
"email": "[email protected]",
"password": "123123"
}
{
"email": "[email protected]",
"password": "123123"
}
то в итоге в консоли будет:
<RedisSession {'4': 'bdbecc331fdc43da9a026e9a2ee70ed0', '1': '0f6b65a2ef7d489abe3a1df8352d2c38'}>
Connection is closed, response is <Response 315 bytes [200 OK]>
т.е оба ключа были добавлены в session и это видно. Если же сразу после этого послать такой запрос с ReactJS, где url - http://127.0.0.1:5000/login, а data - JS-объект {email: '[email protected]', password: '123123'}:
const sendData = async (url, data) => {
const response = await fetch(url, {
method: 'POST',
body: JSON.stringify(data)
})
let res = await response.json();
то в консоли видно, что сессия отчистилась, и в ней есть только те значения, которые пришли от JS:
<RedisSession {'1': '911c73e7fd5b4d02a7a836e38f388837'}>
Connection is closed, response is <Response 315 bytes [200 OK]>
В чем моя ошибка и кто виноват в таком поведении? P.S все пары почт и паролей присутствуют в БД.