django:在pre_save信号中更新会话

时间:2012-03-17 07:14:52

标签: django session

我正在尝试在django中保存会话的开始日期。

我的想法是拦截pre_save信号并将其设置在字典中。但似乎在信号中给我的会话对象没有.get方法,我无法访问字典。看起来会话模型与request.session

不同

如何将其转换为我需要的“会话”对象?

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

TypeError:“Session”类型的参数不可迭代

2 个答案:

答案 0 :(得分:1)

为什么不在视图级别执行此操作?模型基本上不应该对您的观点,会话,请求等有任何了解。

答案 1 :(得分:0)

我设法解决了这个问题。 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()