我正在尝试在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”类型的参数不可迭代
答案 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()