2012-03-17 70 views
0

我想在django中保存一個會話的開始日期。django:在pre_save信號中更新會話

我的想法是攔截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() 

類型錯誤:類型「會話」的說法是不是可迭代

回答

1

爲什麼不能在視圖級別做呢?模型基本上不應該知道任何關於您的意見,會議,請求等。

+0

因爲這應該發生一次,當一個新的會話正在創建時,無論哪個視圖被訪問。即時通訊不太熱衷於將此代碼添加到每個視圖 – mobiletim 2012-03-17 08:09:58

+0

@mobiletim你試圖用這種方式解決什麼任務? – DrTyrsa 2012-03-17 08:56:29

+0

我想記錄在會話變量中創建會話的日期時間 – mobiletim 2012-03-17 09:17:36

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()