【问题标题】:Create activities for an user with Stream-Framework使用 Stream-Framework 为用户创建活动
【发布时间】:2021-05-27 06:37:42
【问题描述】:

我正在尝试设置流框架 here 而不是较新的 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

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

【问题讨论】:

    标签: python redis stream-framework


    【解决方案1】:

    文档不一致。您传递给活动的verb 应该是(一个实例?*stream_framework.verbs.base.Verb 的子类。查看this documentation page on custom verbsthe tests for this 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,看起来通过ints 为actorobject 应该可以工作。但是,这些参数在文档中也可能已过时。


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

    【讨论】:

    • 你没有错,但问题出在演员身上,你的代码给了我同样的错误。请尝试运行您的代码,或者它对您有用吗?谢谢
    • 我无法测试我的代码,因为我既没有安装 stream_framework 也没有安装 redis。您发布的原始错误是该活动无法访问verb.id,现在您说该错误与actor 有关。你能把修正动词后得到的错误添加到你的问题中吗?
    • 安装起来非常简单......而且发布您自己不知道它是否有效的答案也是一种不好的做法。
    • 感谢分享这个,我已经测试了你的代码,我想我发现你的代码确实是正确的问题的主要问题。完成调查后,我将分享相同的内容。
    【解决方案2】:

    @He3lixxx 的伟大answer 的帮助下,我能够部分解决它。由于该软件包不再维护,该软件包安装了最新的 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
      

      那么您需要使用密钥格式为该用户清除数据,在我的情况下,用户 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[:])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多