在Django中处理用户触发事件的正确方法是什么?

Yri*_*uns 6 python django message-queue

例如,我有一个博客基础上Django,我已经有几个功能,为用户login:edit_profile, ,share.

但现在我需要实施一个任务系统.

  1. 用户登录,10 score每天奖励
  2. 用户完成他的个人资料,奖励 20 score
  3. 用户分享我的博客,奖励 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(...)
Run Code Online (Sandbox Code Playgroud)

奖励可以订阅此操作

@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()
Run Code Online (Sandbox Code Playgroud)

但我不知道这是不是正确的方法.如果是这样,我message queue应该使用什么?django-channel/ django-q或其他什么?如果没有,最佳做法是什么?

Sin*_*lil 0

如果您正在寻找异步队列,您将需要 Redis 和工作人员的组合。

最常见、也是最简单的库之一是RQ Workers

实现很简单,但您需要将 rq-workers 作为单独的应用程序运行。

它还允许您实现具有不同优先级的不同队列。我将它们用于发送电子邮件或需要更新而不让用户等待的事情(日志等......)

Django-Q是另一个很好的解决方案,其优点是能够使用当前数据库作为队列 - 而且也可以与 Redis 等一起使用...

最后,Celery是它们的祖父。您可以使用 Celeray 安排作业以及异步作业。有点复杂但很好的解决方案。

希望这可以帮助...