Django - 每次请求都检查用户消息

时间:2010-12-23 11:35:26

标签: django

我想检查用户每次加载页面时是否有新消息。到目前为止,我一直在我的观点中这样做,但由于我现在有相当多的观点,所以维护起来相当困难。

我认为这是中间件有用的东西,每次单页加载都会发生检查。我需要它做的是:

  1. 检查用户是否已登录
  2. 如果是,请检查他们是否有任何消息
  3. 存储结果,以便我可以参考模板中的信息
  4. 有没有人不得不写这样的中间件?我从来没有使用过中间件,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:3)

您可以将中间件用于此目的,但也许context processors更符合您的目标。

使用中间件,您将数据附加到请求对象。您可以查询数据库并找到将消息阻塞到请求中的方法。但是上下文处理器允许您在上下文字典中提供额外的条目,以便在模板中使用。

我认为中间件为您的视图提供额外信息,而上下文处理器为您的模板提供额外信息。这绝不是一个规则,但在一开始它可以帮助这样思考(我相信)。

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

在上下文处理器下的settings.py中包含该处理器。然后,只需在模板中引用new_messages

答案 1 :(得分: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