Feedly-Fashiolista的feed系统框架学习
来源:互联网 发布:淘宝关键词修改不见 编辑:程序博客网 时间:2024/05/02 03:10
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。
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 activity for from, to in changed: print 'changed from %s to %s' % (from, to)
而RecentVerbAggregator是按照默认的方式来对actives排序和组成一个group
而在vies.py中,就可以使用feed方法
@login_requireddef 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
- Feedly-Fashiolista的feed系统框架学习
- 信息聚合系统的数据库后台(比如RSS订阅,feedly)应该如何设计?
- 基本滴简易的feed系统
- 基于Redis的Feed推送系统
- 微博feed系统的push,pull模式
- 用 Feedly Reader 的 Chrome 扩展在 Feedly 里找回 Google Reader 那段欢乐时光
- kohana框架生成feed
- Feed系统构建
- 为Thinkphp开发的系统添加feed页面
- Feedly:替代 Google Reader 的最佳 RSS 阅读器
- feedly快捷键
- Feed系统架构资料收集
- Feed系统架构资料收集
- 社交网络feed系统浅析
- Feed产业链的沉沦
- RSS FEED的应用
- Android 系统框架学习
- 【iOS】系统框架学习
- Android实战技巧:ViewStub的应用
- window2008 64位系统没有office组件问题分析及解决
- opencv之仿射变换
- 深入理解C语言及未定义那些事儿
- html中meta标签的说明
- Feedly-Fashiolista的feed系统框架学习
- abstract类和abstract方法
- GTK+的优点与QT的优点
- ios小demo之图片播放器第一步:加载图片功能
- ARM920T的MMU与Cache ——转载
- C语言运算优先级
- 二叉树三叉链表实现类
- href 怎么使用post方式提交数据
- Android四大组件之ContentProvider