Создавайте действия для пользователя с помощью Stream-Framework

Я пытаюсь настроить поток-фреймворк, который здесь, а не более новый getstream. Я правильно настроил сервер Redis и среду, проблема, с которой я столкнулся, заключается в создании действий для пользователя.

Я пытался создать действия, следуя документации, чтобы добавить действие, но это выдает следующее сообщение об ошибке:

      ...
  File "/Users/.../stream_framework/activity.py", line 110, in serialization_id
    if self.object_id >= 10 ** 10 or self.verb.id >= 10 ** 3:
AttributeError: 'int' object has no attribute 'id'

Вот код

      from stream_framework.activity import Activity
from stream_framework.verbs.base import Follow
from stream_framework.feeds.redis import RedisFeed
from stream_framework.feed_managers.base import Manager, FanoutPriority

class PinFeed(RedisFeed):
    key_format = 'feed:normal:%(user_id)s'

class UserPinFeed(PinFeed):
    key_format = 'feed:user:%(user_id)s'


class PinManager(Manager):
    feed_classes = dict(
        normal=PinFeed,
    )
    user_feed_class = UserPinFeed

    def add_pin(self, pin):
        activity = pin.create_activity()
        # add user activity adds it to the user feed, and starts the fanout
        self.add_user_activity(pin.user_id, activity)

    def get_user_follower_ids(self, user_id):
        ids = Follow.objects.filter(target=user_id).values_list('user_id', flat=True)
        return {FanoutPriority.HIGH:ids}

manager = PinManager()
feed = UserPinFeed(13)

activity = Activity(
        actor=13, # Thierry's user id
        verb=1, # The id associated with the Pin verb
        object=1, # The id of the newly created Pin object
)

feed.add(activity) # Error at this line

Я думаю, что чего-то не хватает в документации или, может быть, я что-то делаю не так. Буду очень признателен, если мне кто-нибудь поможет правильно настроить stream-framework.

2 ответа

Документация противоречива. То, что вы передаете в действие, должно быть (экземпляром? * ) Подклассомstream_framework.verbs.base.Verb. Ознакомьтесь с этой страницей документации о пользовательских глаголах и тестах для этого класса .

Следующее должно исправить опубликованную вами ошибку:

      from stream_framework.activity import Activity
from stream_framework.feeds.redis import RedisFeed
from stream_framework.verbs import register
from stream_framework.verbs.base import Verb

class PinFeed(RedisFeed):
    key_format = 'feed:normal:%(user_id)s'

class UserPinFeed(PinFeed):
    key_format = 'feed:user:%(user_id)s'

class Pin(Verb):
    id = 5
    infinitive = 'pin'
    past_tense = 'pinned'

register(Pin)

feed = UserPinFeed(13)

activity = Activity(
    actor=13,
    verb=Pin,
    object=1,
)

feed.add(activity)

Я быстро просмотрел код для Activity и это похоже на прохождение ints для actor а также objectдолжно сработать. Однако возможно, что эти параметры также устарели в документации.


* Тесты проходят в классах как verb. Тем не менее Verb базовый класс имеет методы serialize а также __str__это может быть осмысленно вызвано только в том случае, если у вас есть объект этого класса. Так что я все еще не уверен, что здесь требуется. Похоже, что в текущем состоянии фреймворк никогда не вызывает эти методы, поэтому классы по-прежнему работают, но я чувствую, что автор изначально намеревался передавать экземпляры.

С помощью большого ответа по He3lixxx, я был в состоянии решить эту проблему частично. Поскольку пакет больше не поддерживается, пакет устанавливает последний клиент Redis для python, который создавал слишком много проблем, поэтому при установке redis-2.10.5 при использовании stream-framework-1.3.7 проблема должна быть устранена.

Я также хотел бы добавить полное руководство по правильному добавлению активности в пользовательский канал.

Ключевые моменты:

  • Если вы не используете диспетчер каналов , обязательно сначала вставьте действие, прежде чем добавлять его пользователю с помощью feed.insert_activity(activity) метод.

  • В случае получения кормов с feed[:] выдает ошибку примерно так:

            File "/Users/.../stream_framework/activity.py", line 44, in get_hydrated
          activity = activities[int(self.serialization_id)]
      KeyError: 16223026351730000000001005L
    

    тогда вам нужно очистить данные для этого пользователя, используя для него формат ключа, в моем случае ключ feed:user:13 для пользователя 13 удалите его с помощью DEL feed:user:13, Если это не решит проблему, вы можете FLUSHALL который удалит все из Redis.

Образец кода:

      from stream_framework.activity import Activity
from stream_framework.feeds.redis import RedisFeed
from stream_framework.verbs import register
from stream_framework.verbs.base import Verb

class PinFeed(RedisFeed):
    key_format = 'feed:normal:%(user_id)s'

class UserPinFeed(PinFeed):
    key_format = 'feed:user:%(user_id)s'

class Pin(Verb):
    id = 5
    infinitive = 'pin'
    past_tense = 'pinned'
register(Pin)


feed = UserPinFeed(13)
print(feed[:])

activity = Activity(
    actor=13,
    verb=Pin,
    object=1)

feed.insert_activity(activity)
activity_id = feed.add(activity)

print(activity_id)
print(feed[:])
Другие вопросы по тегам