Я использую существующую базу данных для моего последнего проекта Django, поэтому, если я не изменю свои Модели или код авторизации Django, объединить их будет довольно сложно.
Вместо того, чтобы возиться с существующим механизмом аутентификации, я планирую просто написать свое собственное приложение для аутентификации.
В любом случае, все мои предыдущие приложения для аутентификации были написаны на PHP, где я просто выбрасываю все в переменные сеанса и проверяю их на каждой странице ... Вот что меня немного смущает. Похоже, что когда пользователь проходит проверку подлинности / вошел в систему, весь пользователь добавляется в сеанс, но я не могу понять, где и как это происходит.
В функции входа в Django по умолчанию она назначает пользователя для request.user ... это каким-то образом сохраняется как переменная сеанса или просто передается в следующее представление? Если оно просто передается следующему представлению, то как аутентифицируются будущие запросы, не требуя дополнительных запросов входа?
Авторизованный логин Django по умолчанию ниже ..
def login(request, user):
"""
Persist a user id and a backend in the request. This way a user doesn't
have to reauthenticate on every request.
"""
if user is None:
user = request.user
# TODO: It would be nice to support different login methods, like signed cookies.
if SESSION_KEY in request.session:
if request.session[SESSION_KEY] != user.id:
# To avoid reusing another user's session, create a new, empty
# session if the existing session corresponds to a different
# authenticated user.
request.session.flush()
else:
request.session.cycle_key()
request.session[SESSION_KEY] = user.id
request.session[BACKEND_SESSION_KEY] = user.backend
if hasattr(request, 'user'):
request.user = user
user_logged_in.send(sender=user.__class__, request=request, user=user)
Я также пытался следовать user_logged_in.send (), который находится в django.dispatch.dispatcher.send, но я не совсем уверен, что он должен делать.
def send(self, sender, **named):
"""
Send signal from sender to all connected receivers.
If any receiver raises an error, the error propagates back through send,
terminating the dispatch loop, so it is quite possible to not have all
receivers called if a raises an error.
Arguments:
sender
The sender of the signal Either a specific object or None.
named
Named arguments which will be passed to receivers.
Returns a list of tuple pairs [(receiver, response), ... ].
"""
responses = []
if not self.receivers:
return responses
for receiver in self._live_receivers(_make_id(sender)):
response = receiver(signal=self, sender=sender, **named)
responses.append((receiver, response))
return responses
По сути, я ищу, чтобы кто-то объяснил эффективный способ сохранения пользовательских данных сеанса в Python, который не зависит от инфраструктуры Django. Небольшой прогон аутентификации в Django тоже подойдет.