2010-12-23 23 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