使用 Stream-Framework 为用户创建活动

Create activities for an user with Stream-Framework

我正在尝试设置流框架 here not the newer getstream。我已经正确设置了 Redis 服务器和环境,我面临的问题是为用户创建活动。

我一直在尝试按照 documentation to add an activity 创建活动,但它给了我如下错误消息:

...
  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

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

文档不一致。您传递给 activity 的 verb 应该是(一个实例?*stream_framework.verbs.base.Verb. Check out this documentation page on custom verbs and the tests for this class 的子class。

以下应该可以修复您发布的错误:

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)

我快速查看了 code for Activity,看起来为 actorobject 传递 int 应该有效。但是,这些参数在文档中也可能已过时。


* 测试在 class 中通过 verb。但是,Verb 基础 class 具有方法 serialize__str__,只有当您拥有此 class 的对象时才能有意义地调用这些方法。所以我仍然不确定这里需要哪个。貌似在目前的状态下,框架从来没有调用过这些方法,所以classes仍然有效,但我感觉作者原本打算传递实例。

如果使用 stream-framework-1.3.7,在伟大 by @He3lixxx, I was able to solve it partially. As the package is no more maintained, the package installs the latest Redis client for python which was creating too many issues so by installation redis-2.10.5 的帮助下,应该可以解决问题。

我还想添加一个完整的指南,以正确地将 activity 添加到用户供稿。

要点:

  • 如果你没有使用feed manager,那么确保在使用feed.insert_activity(activity)方法添加到用户之前先插入activity。

  • 如果使用 feed[:] 获取提要,则会抛出如下错误:

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

    然后您需要使用密钥格式清除该用户的数据,在我的例子中,用户 13 的密钥是 feed:user: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[:])