2010-12-23 10 views
2

페이지를로드 할 때마다 사용자에게 새로운 메시지가 있는지 확인하고 싶습니다. 지금까지, 나는 내 견해의 안에서 이것을하고 있었다. 그러나 내가 공정한 수의 의견을 가지고 있기 때문에 유지하는 것이 꽤 어려워지고있다.Django - 요청마다 사용자 메시지 확인

미들웨어가 좋다고 가정합니다. 매 페이지마다로드가 발생하는 것을 확인합니다. 내가 뭘하는 데 필요한 것은 그래서입니다 : 사용자가

  • 에 기록됩니다

    1. 확인하는 경우 이러한 경우 그들이 그렇게 내 템플릿의 정보를 참조 할 수있는 모든 메시지
    2. 스토어 결과를 가지고 있는지 확인

    누구도 이런 미들웨어를 작성하지 않았습니까? 나는 전에 미들웨어를 사용한 적이 없기 때문에 어떤 도움을 주시면 감사하겠습니다.

  • 답변

    3

    이러한 목적으로 미들웨어를 사용할 수는 있지만, 아마도 context processors은 사용자가 원하는 것을 더 자세히 구현할 수 있습니다.

    미들웨어를 사용하면 데이터를 요청 개체에 첨부 할 수 있습니다. 데이터베이스를 쿼리하고 메시지를 요청에 걸릴 수있는 방법을 찾을 수 있습니다. 하지만 컨텍스트 프로세서를 사용하면 템플릿에서 사용하기 위해 컨텍스트 사전에 추가 항목을 사용할 수 있습니다.

    컨텍스트 프로세서가 템플릿에 추가 정보를 제공하는 반면 미들웨어는보기에 추가 정보를 제공한다고 생각합니다. 이것은 결코 규칙이 아니지만 처음에는 그렇게 생각하는 데 도움이 될 수 있습니다 (저는 믿습니다).

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

    는 상황에 맞는 프로세서에서 당신의 settings.py에서 해당 프로세서를 포함합니다. 그런 다음 템플릿에서 new_messages을 참조하기 만하면됩니다.

    +0

    고맙습니다 만 컨텍스트 프로세서는 보지 않았습니다 만 정확히 내가 필요한 것. – Hanpan

    1

    메시지 렌더링을 위해이 미들웨어를 내 사이트에 작성했습니다. 쿠키가없는 경우 쿠키를 요청하고 저장하기 위해 메시지를 추가합니다. 아마도 비슷한 것을 할 수 있습니다 :

    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