【问题标题】:What is the proper way to process the user-trigger events in Django?在 Django 中处理用户触发事件的正确方法是什么?
【发布时间】:2019-04-23 16:38:22
【问题描述】:

例如,我有一个基于Django 的博客,并且我已经为用户提供了几个功能:loginedit_profileshare

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

  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(...)

并且奖励可以订阅这个动作

@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 queuedjango-channel / django-q 还是别的什么? 如果没有,最佳做法是什么?

【问题讨论】:

  • 您的发件人/收件人方法似乎是个好主意。可能比我使用的方法更容易实现(即,数据库触发器耦合到单独的服务并由单独的服务处理)。您是否尝试过实施您描述的方法?如果有,结果如何?
  • 不,我没有。我还在考虑一个合适的方法,哈哈。
  • 你考虑过Django Signals吗?更新配置文件后,您可以使用post_save 运行您的分数逻辑。否则我会在应用程序启动时启动一个监控线程(可能使用中间件),它会消耗放入队列中的消息。我会使用 Python 的内置队列并将消息放入我的视图函数中。
  • 是的,我知道signal。但它是同步的,这就是我提到django-q的原因。

标签: python django message-queue


【解决方案1】:

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

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

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

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

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

最后,Celery 是他们所有人的祖父。您可以使用 Celeray 进行计划作业以及异步作业。稍微复杂一点但很好的解决方案。

希望这会有所帮助...

【讨论】:

    【解决方案2】:

    当涉及到使用 Django 或任何 Python 框架来提示任务时,您正在寻求做的事情是相当正常的。虽然没有“正确”的方法可以做到这一点,但我个人建议使用 Redis。考虑到您将有很多用户获得积分,这将使您的查询速度非常快。

    你自然可以用 Celery 来制作你自己的 Stack。一切都将在 RAM 中完成,这将有助于此类重复性任务。

    你可以看看Redis for Django over here

    您基本上需要将其作为缓存服务器包含在您的设置中。

    在你实现提示的任何文件中,记得添加以下内容:

    from django.core.cache.backends.base import DEFAULT_TIMEOUT
    from django.views.decorators.cache import cache_page
    

    我同意最初设置它似乎令人生畏,但相信我,这是快速有效地提示任何任务的好方法。试一试!您会发现它在您的所有项目中都非常有用。

    【讨论】:

      【解决方案3】:

      对于您可以使用的任务/作业的异步/延迟执行

      芹菜:https://github.com/celery/celery/

      姜戈: http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

      【讨论】:

        猜你喜欢
        • 2012-03-31
        • 1970-01-01
        • 2021-09-12
        • 2018-10-12
        • 2012-07-22
        • 2011-11-29
        • 2013-07-24
        • 1970-01-01
        • 2020-06-26
        相关资源
        最近更新 更多