• Как выполнять отложенные задачи на бекенде?

    Альтернативный подход - вообще не хранить текущий статус пользователя. Вместо этого, хранить журнал изменений этого статуса и вычислять его текущее значение по требованию. Мне привычно рассуждать в терминах Django, на её ORM и будем ориентироваться. Пусть у вас есть своя собственная модель для пользователя - User в приложении my_auth. Пусть у него может быть два значения статуса: пустое (None) и premium - для тех, кто оплатил подписку на год. Журнал изменений статуса:

    from django.db import models
    from my_auth.models import User
    
    class StatusEvent(models.Model):
        EVENT_TYPES = [
            ('subscription', 'User subscribed to premium')
        ]
        user = models.ForeignKey(User, related_name='events')
        time = models.DateTimeField(auto_now_add=True)
        type = models.CharField(max_length=16, choices=EVENT_TYPES)
    
        class Meta:
            ordering = '-time'


    Функция вычисления статуса определена в модели User:

    from datetime import datetime
    from django.contrib.auth.models import User as DefaultUser
    
    class User(DefaultUser):
        @property
        def status(self):
            event = self.events.filter(type='subscription').first()
            if event and datetime.now() - event.time < self.subscription_duration:
                return 'premium'


    Здесь subscription_duration - длительность действия подписки, значение типа datetime.timedelta. Ну или relativedelta из dateutil можно использовать, оно удобней. Да, это влечёт постоянные проверки статуса, но не думаю, что это такая уж большая проблема в сравнении с тем, чтоб городить ещё один процесс крона или Celery, чрезмерно усложняя систему.
    Ответ написан
    Комментировать
  • Как генерировать хеш-код на основе ключа в Python3?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    >>> import hmac, hashlib
    >>> res = hmac.new('signature', 'text', hashlib.sha256)
    >>> res.hexdigest()
    '3bd9ef87a8de4633a588904d24a64670905a3375687ae52e3daeba82dd702269'


    В 3-м питоне нужно дополнительно преобразовывать строки:
    >>> hmac.new(bytearray('signature','utf-8'), bytearray('text','utf-8'), hashlib.sha256).hexdigest()
    '3bd9ef87a8de4633a588904d24a64670905a3375687ae52e3daeba82dd702269'
    Ответ написан
    3 комментария
  • Как подружить во Flask два модуля: Flask-Mobility и Flask-Cache?

    crazyzubr
    @crazyzubr
    Python backend-developer
    Декоратор @cache.cached ничего не знает о декораторе @mobile_template.
    Как один из вариантов можно создать собственную функцию для формирования префикса для ключа.

    def mobile_key_prefix():
        return '%s/%s' % (is_mobile(request), request.path)
    
    @cache.cached(timeout=50, key_prefix=mobile_key_prefix)


    Здесь я указал функцию is_mobile(request) - она должна возвращать соответственно разные строки для мобильных и для десктопов. Так ключ будет отличатся, и будут отображаться верные данные.
    Ответ написан
    1 комментарий
  • Как динамично переводить текст в Jinja2?

    @s1dney
    Вот это поможет - Babel.
    А вот тут даже есть пример как это использовать с Flask.
    Ответ написан
    Комментировать
  • Объясните, зачем нужны документо-ориентированные БД (MongoDB)?

    Если абстрагироваться от таких «мелочей» как производительность, масштабируемость и надёжность, то Д(окументно)О(ориентированные)СУБД и О(объектно)О(ориентированные)СУБД во многих случаях позволяют разработчику отражать сущности предметной области на сущности БД без введения дополнительных сущностей :), которые приходится вводить в Р(еляционных)СУБД. Например, сколько копий переломано в спорах о том, как хранить в РСУБД объекты различных классов, унаследованных от одного базового класса (в одной таблице с кучей пустых полей, в таблицах для каждого отдельного класса, в общей таблице общие поля, ...), а тут просто храним в одной «таблице» и не думаем о таких мелочах. Отношения 1:1 и 1: М, когда сущности во второй половине отношения принадлежат одной и только одной сущности первой и не имеют смысла без неё также отображаются без дополнительных таблиц и полей для связи (вместо comments.post_id и comments.content просто храним в поле posts.comments список/массив комментов, не заботясь о целостности связей, синхронизации и т. п.). Другими словами, ДОСУБД часто облегчают жизнь разработчику, хотя иногда её усложняют (когда связи двунаправленные прежде всего, особенно M: М — для установления связи между двумя уже существующими сущностями надо производить две операции — добавление к первой ссылку на вторую, а ко второй на первую -, а не одну — добавление в таблицу связи — как в РСУБД )
    Ответ написан
    Комментировать