django: обновить сеанс в сигнале pre_save - PullRequest
0 голосов
/ 17 марта 2012

Я пытаюсь сохранить дату начала сеанса в django.

Моя идея состояла в том, чтобы перехватить сигнал pre_save и установить его в словаре.однако кажется, что у объекта сеанса, который дан мне в сигнале, нет методов .get, и я не могу получить доступ к словарю.похоже, что модель сеанса отличается от request.session

как я могу превратить это в нужный мне объект 'сеанса'?не повторяется

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Почему бы не сделать это на уровне просмотра?В основном модели не должны ничего знать о ваших представлениях, сеансах, запросах и т. Д.

0 голосов
/ 18 марта 2012

Мне удалось понять это.django кодирует данные для сохранения в базе данных и декодирует перед помещением их в объект запроса.

@receiver(signals.pre_save, sender=Session, dispatch_uid='session_pre_save')
def session_pre_save(sender, **kwargs):
    s = kwargs['instance']
    data = s.get_decoded()
    if 'start' not in data:
        data['start'] = datetime.now()
        s.session_data =  Session.objects.encode(data)

однако django не сохраняет эти сеансы до тех пор, пока что-то там не будет.так что вы можете получить разные ключи сессии при каждой загрузке страницы, если ничего не читается / не записывается.так что в итоге я создал промежуточное программное обеспечение:

class SessionInitMiddleware:
    """ middleware that initialises session """
    def process_view(self, request, view_func, view_args, view_kwargs):
        session_start = request.session.get('start', "")
        if session_start == "":
            request.session['start'] = datetime.now()
            request.session.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...