Как правильно обрабатывать пользовательские события в Django? - PullRequest
0 голосов
/ 21 ноября 2018

Например, у меня есть блог на основе Django, и у меня уже есть несколько функций для пользователей: loginedit_profileshare.

Но теперь мне нужно выполнить миссиюsystem.

  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 queue я должен использовать?django-channel / django-q или что-то еще?Если нет, то какова лучшая практика?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Для асинхронного / отложенного выполнения задач / заданий вы можете использовать

Сельдерей: https://github.com/celery/celery/

Джанго: http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

0 голосов
/ 29 ноября 2018

Если вы ищете асинхронную очередь, вам понадобится комбо Redis и рабочих.

Одной из самых распространенных и простых библиотек для этого является RQ Workers

Реализация проста, но вам нужно будет запустить rq-worker какотдельное приложение.

Также позволяет создавать разные очереди с разными приоритетами.Я использую их для таких вещей, как отправка электронных писем или вещей, которые необходимо обновить, не заставляя пользователя ждать (логи и т. Д.)

Django-Q - еще одно хорошее решение с преимуществомвозможность использовать вашу текущую базу данных в качестве очереди - но также работает с Redis и другими ...

Наконец, Celery является их дедушкой.Вы можете иметь запланированные задания с Celeray, а также асинхронные задания.Немного более сложное, но хорошее решение.

Надеюсь, это поможет ...

0 голосов
/ 23 ноября 2018

То, что вы стремитесь сделать, вполне нормально, когда дело доходит до задач с Django или любым Python-фреймворком в этом отношении.Хотя нет «правильного» способа сделать это, я лично рекомендовал бы пойти с Redis.Учитывая, что у вас будет много пользователей, получающих очки, это сделает ваши запросы действительно быстрыми.

Вы можете сделать это с помощью Celery, чтобы создать свой собственный стек.Все будет сделано в оперативной памяти, что будет полезно для таких повторяющихся задач.

Вы можете взглянуть на Redis для Django здесь .

Вам, по сути, понадобитсячтобы включить это как кеширующий сервер в ваших настройках.

В каком бы файле вы не выполняли настройку, не забудьте добавить следующее:

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

Я бы согласился, что первоначальная настройка кажется сложной,но поверьте мне, это отличный способ быстро и эффективно выполнить любую задачу.Дать ему шанс!Вы найдете его чрезвычайно полезным во всех ваших проектах.

...