Django Memcached сеанс удаляется - PullRequest
0 голосов
/ 04 марта 2019

Два приложения Django (DRF) работают на двух отдельных портах 8001 и 8000 с одним хостом localhost.Я использую memcached для хранения сессий.Оба приложения совместно используют сессии из memcache.Когда я пытаюсь получить доступ к страницам, используя второе приложение, после входа в систему с использованием первого я получаю сообщение об ошибке:

" Сеанс запроса был удален до завершения запроса. Возможно, пользователь вышел из системы в параллельном запросе,например. "

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

Sessionmiddlewareможет заполнить объект сеанса в объекте Request, но после выполнения приведенной ниже строки кода в AuthenticationMiddleware request.user = SimpleLazyObject (lambda: get_user (request)) Элементы словаря session._session были удалены.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Для решения этой проблемы нам нужно добавить один и тот же секретный ключ в настройках обоих приложений Django.Django добавляет пользователя в тело запроса в authmiddleware.Пользователь может быть анонимным (неаутентифицированным) или аутентифицированным пользователем.Сеанс проверяется перед добавлением пользователя в запрос.Эта проверка выполняется следующим образом.

session_hash_verified = session_hash и constant_time_compare (session_hash, user.get_session_auth_hash ())

Эта функция user.get_session_auth_hash () использует salted_hmac (ключ, self.password) .hexdigest () функция для проверки.Функция salted_hmac использует settings.SECRET_KEY для вычисления хеша.Если секретные ключи обоих приложений различны, hasj сессии не будет изменен.

0 голосов
/ 04 марта 2019

В приведенном выше случае вы запускаете приложение на двух разных портах с одной и той же базой данных.Если user1 вошел в систему с портом 8000, то для него будет создан сеанс.И снова user1 вошел в систему с портом 8001, тогда существующий сеанс будет заменен / уничтожен новым сеансом.Потому что браузер обрабатывает localhost:8000 и localhost:8001 как два разных домена.

Чтобы избежать этого, вы можете использовать nginx в качестве reverse proxy сервера с тем же ip 127.0.0.1 или доменом localhost.Теперь направьте запросы API к порту 8001 и веб-запросы к порту 8000.

. В приведенном выше случае домен localhost остается таким же, поэтому django не заменит существующий сеанс.Итак, это будет работать.

Ссылка: https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

...