Django - проверять сообщения пользователей каждый запрос - PullRequest
2 голосов
/ 23 декабря 2010

Я хочу проверить, есть ли у пользователя новые сообщения при каждой загрузке страницы. До сих пор я занимался этим в своих представлениях, но поддерживать его довольно сложно, поскольку у меня сейчас достаточно представлений.

Полагаю, для такого промежуточного программного обеспечения полезна проверка, которая будет выполняться при каждой загрузке страницы. Что мне нужно сделать это так:

  1. Проверьте, вошел ли пользователь в систему
  2. Если они есть, проверьте, есть ли у них сообщения
  3. Сохраните результат, чтобы я мог ссылаться на информацию в моих шаблонах

Кто-нибудь когда-нибудь писал такую ​​промежуточную программу, как эта? Я никогда раньше не использовал промежуточное программное обеспечение, поэтому любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Вы можете использовать промежуточное ПО для этой цели, но, возможно, контекстные процессоры более встроены в то, что вы хотите сделать.

С промежуточным ПО вы присоединяете данные к объекту запроса. Вы можете запросить базу данных и найти способ вставить сообщения в запрос. Но контекстные процессоры позволяют вам делать дополнительные записи в контекстном словаре для использования в ваших шаблонах.

Я считаю, что промежуточное ПО предоставляет дополнительную информацию для ваших представлений, в то время как процессоры контекста предоставляют дополнительную информацию вашим шаблонам. Это ни в коем случае не правило, но в начале это может помочь мыслить так (я верю).

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

Включите этот процессор в settings.py в контекстные процессоры. Затем просто укажите в своих шаблонах new_messages.

1 голос
/ 23 декабря 2010

Я написал это промежуточное ПО на моем сайте для рендеринга сообщений. Он проверяет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...