0

我正在尝试在此处设置流框架,而不是较新的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.feeds.redis import RedisFeed


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

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

feed = UserPinFeed(13)
print(feed)

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

我认为文档中缺少某些内容,或者我做错了什么。如果有人帮助我让流框架正常工作,我将不胜感激。

4

2 回答 2

1

文档不一致。你传递给活动的verb应该是(一个实例?*)的一个子类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,它看起来像传递intsactor并且object应该可以工作。但是,这些参数在文档中也可能已过时。


*测试以verb. 但是,Verb基类具有方法,serialize并且__str__只有在您拥有此类的对象时才能有意义地调用这些方法。所以我仍然不确定这里需要哪个。目前看来,框架从不调用这些方法,所以类仍然可以工作,但我感觉作者本来是打算传递实例的。

于 2021-05-29T14:05:26.333 回答
0

在@He3lixxx的出色回答的帮助下,我能够部分解决它。由于不再维护该包,该包安装了最新的 Python Redis 客户端,这会产生太多问题,因此如果使用 stream-framework-1.3.7,安装redis-2.10.5应该可以解决该问题。

我还想添加一个完整的指南,以正确地将活动添加到用户提要中。

关键点:

  • 如果您没有使用feed manager,请确保在使用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[:])
于 2021-05-29T17:36:28.963 回答