Создавайте действия для пользователя с помощью 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
и это похоже на прохождение
int
s для
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[:])