我想检查用户每次加载页面时是否有新消息。到目前为止,我一直在我的观点中这样做,但由于我现在有相当多的观点,所以维护起来相当困难。
我认为这是中间件有用的东西,每次单页加载都会发生检查。我需要它做的是:
有没有人不得不写这样的中间件?我从来没有使用过中间件,所以任何帮助都会非常感激。
答案 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