您的位置:首页 > Web前端

Feedly-Fashiolista的feed系统框架学习

2014-04-08 18:37 218 查看
django的feed第三方包,有个feedly,是时尚分享网站Fashiolista的开源feed系统框架的python版本

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

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

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

http://activitystrea.ms/specs/atom/1.0/#activity.summary有总结

其中,Verb是一个IRI 引用,可以标识活动的”动作“, feedly源码中内置有follow,comment,love,add,除了这些,完整的verb在http://activitystrea.ms/head/activity-schema.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 Activity
from core.verbs import Pin as PinVerb
activity = 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 = RecentVerbAggregator
key_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 = 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 remove_pin(self, pin):
activity = pin.create_activity()
# removes the pin from the user's followers feeds
self.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:

a9eb
print activity

for 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, activities
context['feed_pins'] = enrich_activities(activities)
response = render_to_response('core/feed.html', context)
return response
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python feedly django redis
相关文章推荐