Невозможно прочитать данные сеанса из базы данных
Я унаследовал унаследованное приложение django (в настоящее время на 2.2.24
), которое я пытаюсь модернизировать шаг за шагом. Одним из требований является переход от MySQL к базе данных Azure SQL.
К сожалению, я столкнулся с проблемой, когда я просто не могу считать данные сессии из базы данных.
Вот как выглядит мой settings.py. Как вы можете видеть, django.contrib.sessions
установлен, также как и django.contrib.sessions.middleware.SessionMiddleware
. Также я явно установил SESSION_ENGINE = 'django.contrib.sessions.backends.db'
, который должен быть по умолчанию.
# ...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_swagger',
# ...
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'simple_history.middleware.HistoryRequestMiddleware',
]
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
]
DATABASES = {
'default': {
'ENGINE': 'mssql', # https://github.com/microsoft/mssql-django
'NAME': '<hiden>',
'USER': '<hiden>',
'PASSWORD': '<hiden>',
'HOST': '<hiden>',
'PORT': '1433,
'OPTIONS': {
'driver': 'ODBC Driver 17 for SQL Server',
}
}
}
# ...
Вот как выглядит ошибочный views.py, который является частью процедуры входа в Azure AD (def auth(request)
=> sso/login
& def complete(request)
=> sso/complete
)
После выхода из def auth(request)
я вижу новую запись в таблице dbo.django_session
. Однако, когда выполнение входит в def complete(request)
, словарь сеанса пуст.
@never_cache
def auth(request):
request.session.flush()
nonce = str(uuid.uuid4())
request.session['nonce'] = nonce # store to session db
state = str(uuid.uuid4())
request.session['state'] = state # store to session db
backend = AzureActiveDirectoryBackend()
redirect_uri = AZURE_AD_REDIRECT_URI or request.build_absolute_uri(reverse(complete))
login_url = backend.login_url(
nonce=nonce,
state=state,
redirect_uri=redirect_uri
)
if settings.DEBUG:
print('login_url:', login_url)
return HttpResponseRedirect(login_url)
@never_cache
@csrf_exempt
def complete(request):
backend = AzureActiveDirectoryBackend()
method = 'GET' if backend.RESPONSE_MODE == 'fragment' else 'POST' # form_post / fragment
# EMPTY
keys = request.session.keys()
items = request.session.items()
# EMPTY AS WELL
original_state = request.session.get('state') # dictionary from SessionMiddleware
resp_meta = getattr(request, method) # request.GET / request.POST
state = resp_meta.get('state')
if original_state != state:
return HttpResponse('<h1>State is lost</h1>\n\nRefresh the page (F5).')
if "error" in resp_meta:
return HttpResponse('<h1>%s</h1> \n %s \n\n error_uri:<a>%s</a>' % (
resp_meta['error'], resp_meta['error_description'], resp_meta['error_uri']))
# ...
Что здесь происходит? Любая помощь в этом вопросе будет очень признательна!