【发布时间】:2019-04-23 16:38:22
【问题描述】:
例如,我有一个基于Django 的博客,并且我已经为用户提供了几个功能:login、edit_profile、share。
但现在我需要实现一个任务系统。
- 用户登录,每天奖励
10 score - 用户完成个人资料,奖励
20 score - 用户分享我的博客,打赏
30 score
我不想将奖励代码与普通函数代码混在一起。所以我决定使用message queue。伪代码可能如下所示:
@login_required
def edit_profile(request):
user = request.user
nickname = ...
desc = ...
user.save(...)
action.send(sender='edit_profile', payload={'user_id': user.id})
return Response(...)
并且奖励可以订阅这个动作
@receiver('edit_profile')
def edit_profile_reward(payload):
user_id = payload['user_id']
user = User.objects.get(id=user_id)
mission, created = Mission.objects.get_or_create(user=user, type='complete_profile')
if created:
user.score += 20
user.save()
但我不知道这是否是正确的方法。如果是这样,我应该使用什么message queue? django-channel / django-q 还是别的什么?
如果没有,最佳做法是什么?
【问题讨论】:
-
您的发件人/收件人方法似乎是个好主意。可能比我使用的方法更容易实现(即,数据库触发器耦合到单独的服务并由单独的服务处理)。您是否尝试过实施您描述的方法?如果有,结果如何?
-
不,我没有。我还在考虑一个合适的方法,哈哈。
-
你考虑过Django Signals吗?更新配置文件后,您可以使用
post_save运行您的分数逻辑。否则我会在应用程序启动时启动一个监控线程(可能使用中间件),它会消耗放入队列中的消息。我会使用 Python 的内置队列并将消息放入我的视图函数中。 -
是的,我知道
signal。但它是同步的,这就是我提到django-q的原因。
标签: python django message-queue