#python #django #django-authentication #django-sessions #django-users
#python #django #django-аутентификация #django-сеансы #django-пользователи
Вопрос:
Мне нужно, чтобы функция сообщала мне, аутентифицирован ли идентификатор сеанса Django в данный момент или нет. Я понимаю, что это уже встроено в Django, и у меня это работает просто отлично.
Но у меня есть внешнее приложение, которому передается идентификатор сеанса, и когда оно передает строку идентификатора сеанса обратно в Django, мне нужно подтвердить, что этот идентификатор сеанса действителен и в данный момент аутентифицирован.
С чего мне начать повторное использование некоторых встроенных функций Django 1.2?
Ответ №1:
Вы можете сделать это следующим образом (не тестировалось, но это показывает вам возможный способ):
from django.utils.importlib import import_module
from django.conf import settings
from django.contrib.auth import get_user
from django.contrib.auth.models import AnonymousUser
from django.contrib.auth import SESSION_KEY, BACKEND_SESSION_KEY, load_backend
engine = import_module(settings.SESSION_ENGINE)
session = engine.SessionStore(YOUR_SESSION_KEY)
try:
user_id = session[SESSION_KEY]
backend_path = session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
user = AnonymousUser()
if user.is_authenticated():
print "User"
else:
print "Guest"
Комментарии:
1. ‘YOUR_SESSION_KEY’ используется перед блоком try / except , так что разве это не завершилось бы полным сбоем, если бы YOUR_SESSION_KEY не существовал?
Ответ №2:
Вот строка в исходном коде, django.contrib.auth.__init__.login
которая регистрирует пользователя.
request.session[SESSION_KEY] = user.id
При выходе из системы сеанс полностью сбрасывается, поэтому наличие этого ключа является аутентифицированным пользователем.
from django.contrib.auth import SESSION_KEY
from django.contrib.sessions.models import Session
try:
session = Session.objects.get(session_key=my_key)
session.get_decoded()[SESSION_KEY]
return (True, "Authenticated")
except (Session.DoesNotExist, KeyError):
return (False, "Not authenticated")
PS: хороший вариант от aeby для извлечения из session engine, если вы не используете сеансы db.
Комментарии:
1. Осторожно: это работает только с хранилищем сеансов, поддерживаемым базой данных. Если вы рассмотрите возможность использования кэша, файла или файла cookie, это не сработает.