2010-12-23 22 views
2

我想檢查用戶每次加載頁面時是否有任何新消息。到目前爲止,我一直在做我的觀點,但由於我現在有相當多的觀點,所以維護起來相當困難。Django - 每個請求檢查用戶消息

我認爲這是中間件很好的一種事情,每隔一頁加載就會發生一次檢查。我需要做的就是這樣:

  1. 檢查,如果用戶在
  2. 記錄如果是這樣,檢查他們是否有任何消息
  3. 商店的結果,所以我可以引用我的模板信息

有沒有人曾經寫過這樣的中間件?我以前從未使用中間件,所以任何幫助將不勝感激。

回答

3

您可以使用中間件來達到此目的,但context processors可能更符合您的要求。

使用中間件,您將數據附加到請求對象。您可以查詢數據庫並找到一種方法將消息堵塞到請求中。但是上下文處理器允許您在上下文字典中提供額外條目以供在模板中使用。

我認爲中間件可以爲視圖提供額外的信息,而上下文處理器爲您的模板提供額外的信息。這絕不是一個規則,但在一開始,它可以幫助我們這樣思考(我相信)。

def messages_processor(request): 
    return { 'new_messages': Message.objects.filter(unread=True, user=request.user) } 

將該處理器包含在上下文處理器的settings.py中。然後只需在您的模板中引用new_messages

+0

謝謝你,我沒有看過context處理器,但它似乎是正是我需要的。 – Hanpan 2010-12-23 11:55:57

1

我在我的網站上編寫了這個中間件來渲染消息。它檢查一個cookie,如果它不存在,其追加的消息請求,並節省了一個cookie,也許你可以做同樣的事情:

class MyMiddleware: 


def __init__(self): 
     #print 'Initialized my Middleware' 
     pass 

    def process_request(self, request):   
     user_id = False 
     if request.user.is_active:     
      user_id = str(request.user.id)        
     self.process_update_messages(request, user_id) 

    def process_response(self, request, response): 
     self.process_update_messages_response(request, response) 
     return response 

    def process_update_messages(self, request, user_id=False): 
     update_messages = UpdateMessage.objects.exclude(expired=True)   
     render_message = False 
     request.session['update_messages'] = [] 
     for message in update_messages:       
      if message.expire_time < datetime.datetime.now(): 
       message.expired = True 
       message.save() 
      else:     
       if request.COOKIES.get(message.cookie(), True) == True: 
        render_message = True 
       if render_message: 
        request.session['update_messages'].append({'cookie': message.cookie(), 'cookie_max_age': message.cookie_max_age}) 
        messages.add_message(request, message.level, message) 
        break 

    def process_update_messages_response(self, request, response): 
     try: 
      update_messages = request.session['update_messages'] 
     except: 
      update_messages = False 
     if update_messages:    
      for message in update_messages: 
       response.set_cookie(message['cookie'], value=False, max_age=message['cookie_max_age'], expires=None, path='/', domain=None, secure=None) 
     return response