Feedly

编程入门 行业动态 更新时间:2024-10-24 21:23:31

<a href=https://www.elefans.com/category/jswz/34/1746884.html style=Feedly"/>

Feedly

django的feed第三方包,有个feedly,是时尚分享网站Fashiolista的开源feed系统框架的python版本


csdn上关于该系统的文章的翻译:百万用户时尚分享网站feed系统扩展实践

但该feed系统的文档,原作者在github上表示,还在写,so,只能自己去看源码 了以及feedly的例子app:feedly_pin~~


feedly基于activate-活动,一个活动包含了各种元素,在文档

.0/#activity.summary有总结


其中,Verb是一个IRI 引用,可以标识活动的”动作“, feedly源码中内置有follow,comment,love,add,除了这些,完整的verb在.html#verbs

文档中。也可以自定义一个,就像feedly_pin里面一样,定义自己的verb-Pin,继承与抽象类Verb,然后注册该Verb。Verb一个活动只能有一个。


Target是活动的目标,例如:小明保存保存异步电影到他的许愿单,许愿单就是target,target不能是一个活动,并且,target必须不能多于一个。

原文

The target of an activity is an Object Construct that represents the object to which the activity was performed. The exact meaning of an activity's target is dependent on the verb of the activity, but will often be the object of the English preposition "to". For example, in the activity "John saved a movie to his wishlist", the target of the activity is "wishlist". The activity target MUST NOT be used to identify an indirect object that is not a target of the activity. An Activity construct MAY have a target but it MUST NOT have more than one.


对照feedly_pin例子的代码,在model.py里面,定义create_activity方法,生成活动,feedly_pin例子:

class Pin(BaseModel):user = models.ForeignKey(settings.AUTH_USER_MODEL)item = models.ForeignKey(Item)board = models.ForeignKey(Board)influencer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='influenced_pins')message = models.TextField(blank=True, null=True)created_at = models.DateTimeField(auto_now_add=True)def create_activity(self):from feedly.activity import Activityfrom core.verbs import Pin as PinVerbactivity = Activity(self.user_id,PinVerb,self.id,self.influencer_id,time=make_naive(self.created_at, pytz.utc),extra_context=dict(item_id=self.item_id))return activity

参数

 self.user_id, PinVerb, self.id, self.influencer_id, time=make_naive(self.created_at, pytz.utc), extra_context=dict(item_id=self.item_id)

一一对应该活动的id,Verb,创建这个活动的user的id,target(这里是influencer,也是user用户),time,额外的context_data


在pin_feed.py,定义需要的feed,继承于RedisFeed,表示存储我们的feed用redis后台

class PinFeed(RedisFeed):key_format = 'feed:normal:%(user_id)s'class AggregatedPinFeed(RedisAggregatedFeed):aggregator_class = RecentVerbAggregatorkey_format = 'feed:aggregated:%(user_id)s'class UserPinFeed(PinFeed):key_format = 'feed:user:%(user_id)s'

在pin_feedly.py,生成我们的feedly对象


class PinFeedly(Feedly):# this example has both a normal feed and an aggregated feed (more like# how facebook or wanelo uses feeds)feed_classes = dict(normal=PinFeed,aggregated=AggregatedPinFeed)user_feed_class = UserPinFeeddef add_pin(self, pin):activity = pin.create_activity()# add user activity adds it to the user feed, and starts the fanoutself.add_user_activity(pin.user_id, activity)def remove_pin(self, pin):activity = pin.create_activity()# removes the pin from the user's followers feedsself.remove_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}feedly = PinFeedly()


AggregatedFeed是Feed的扩展,它将活动集合到一个类里面,也就是BaseAggregator。

BaseAggregator有两个最重要的方法,

Aggregate:接受一个包含活动的list,将这个list集合成一个已排序的aggregated activities列表

Merge:将一个aggregated activities和一个activate,返回一个新的aggregated activities和一个已经改变的,aggregated activities列表

例子:

            activities = [Activity(1), Activity(2)]aggregated_activities = aggregator.aggregate(activities)activities = [Activity(3), Activity(4)]new, changed = aggregator.merge(aggregated_activities, activities)for activity in new:print activityfor from, to in changed:print 'changed from %s to %s' % (from, to)


而RecentVerbAggregator是按照默认的方式来对actives排序和组成一个group


而在vies.py中,就可以使用feed方法


@login_required
def feed(request):'''Items pinned by the people you follow'''context = RequestContext(request)feed = feedly.get_feeds(request.user.id)['normal']if request.REQUEST.get('delete'):feed.delete()activities = list(feed[:25])if request.REQUEST.get('raise'):raise Exception, activitiescontext['feed_pins'] = enrich_activities(activities)response = render_to_response('core/feed.html', context)return response






更多推荐

Feedly

本文发布于:2024-02-06 05:21:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1746739.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Feedly

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!