Django: как получить доступ к session_key в промежуточном программном обеспечении

Я не могу получить доступ к session_key в моем пользовательском промежуточном программном обеспечении Django. Я пытаюсь получить к нему доступ, используя:

session = Session.objects.get(pk=request.session._session_key)

or

session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
session = Session.objects.get(pk=session_key)

Я получаю сообщение об ошибке:

Session matching query does not exist.

Я поместил свое промежуточное ПО в конец MIDDLEWARE_CLASSES и после django.contrib.sessions.middleware.SessionMiddleware в моем settings.py файле.

Я могу установить ключи сеанса в промежуточном программном обеспечении, но похоже, что session_key создается / становится доступным только после отображения полной страницы. Потому что, когда страница отображается впервые, {{ request.session.session_key }} возвращает None в моем шаблоне. Когда я обновляю страницу, я вижу session_key. Любые советы о том, как я могу получить доступ к session_key, очень приветствуются.


person Snels Nick    schedule 17.05.2012    source источник
comment
Зачем вам нужен этот запрос? Почему бы просто не получить доступ к request.session напрямую?   -  person Daniel Roseman    schedule 17.05.2012
comment
У меня есть таблица, которая ссылается на таблицу django_session, например: session = models.ForeignKey (Session) Когда я создаю его экземпляр, например, используя request.session, он выдает следующую ошибку: Невозможно назначить ‹django.contrib.sessions.backends Объект .db.SessionStore по адресу 0x00000000025CC518 ›: Visitor.session должен быть экземпляром сеанса. Вот почему я пытаюсь запросить таблицу сеанса, чтобы получить экземпляр сеанса.   -  person Snels Nick    schedule 17.05.2012
comment
У вас действительно есть сеансовый ключ, когда вы нажимаете db? Новые сеансы создаются только в process_response промежуточном программном обеспечении сеанса - потому что им нужно хранить что-либо из представления, и они не могут этого сделать, пока представление не будет полностью обработано.   -  person ilvar    schedule 18.05.2012


Ответы (2)


Мне удалось заставить его работать. Оказывается, обычно сеанс сохраняется только после рендеринга всей страницы.

Мне удалось преждевременно сохранить сеанс в моем промежуточном программном обеспечении, используя:

request.session.save()

Затем я мог бы сохранить свою модель, например (обратите внимание на _id после сеанса, который позволяет вам установить внешний ключ, использующий только целое число или varchar в моем случае):

visitor = Visitor()
visitor.session_id = request.session.session_key
visitor.save()
person Snels Nick    schedule 18.05.2012

Я смог сделать это со следующим, работает ли это для вас?

Session.objects.get(session_key=request.session.session_key)

Если нет, возможно, @ilvar верно, что вы пытаетесь получить доступ к сеансу до того, как он станет активным.

person Furbeenator    schedule 18.05.2012