【发布时间】:2016-09-23 11:46:55
【问题描述】:
在我维护的一个 Django 应用程序中,用户登录并相互交换消息,论坛风格。在任何给定时间点,我都会通过检查在过去 5 分钟内记录session 对象的人来显示谁在线。为此,我使用了 Django 插件 user_sessions,它允许像常规 ORM 一样操作会话。
我的代码是这样的:
class WhoseOnlineView(ListView):
model = Session
template_name = "whose_online.html"
def get_queryset(self):
unique_user_sessions = Session.objects.filter(last_activity__gte=(timezone.now()-timedelta(minutes=5))).only('user').distinct('user')
users = [session.user for session in unique_user_sessions]
users = [user for user in users if user is not None] #sanitizing None values
return users
该网站的用户(和功能)已显着增长,并且根据 newrelic 的说法,在我所有的视图中,这个特定视图消耗的时间最多。
我想我应该将整个任务移到异步完成。我在我的生产服务器上启动并运行了 celery(使用 redis 作为消息代理)。
这可能是一项周期性任务,每 60 秒执行一次。但似乎要让它工作,我需要在数据库(或缓存)中保存结果,以便用户可以看到保存的结果,直到下一次处理其在线列表.
谁能给我一个说明性的例子来说明如何做到这一点?我正在努力解决的主要问题是如何在下一个定期任务开始之前保存(或缓存)然后显示给用户的结果。
【问题讨论】:
标签: django django-models redis django-views celery