学习python flask之11:在你的网站中实现用户之间的关注功能

由于SQLAlchemy ORM, 一个用户关注另一个用户能记录在数据库中的followed关系表中。假设有两个用户user1和user2,那么添加一个关注关系可用如下代码:

user1.followed.append(user2)

删除一个关注关系:

user1.followed.remove(user2)

尽管添加和删除关注关系很容易,我希望提高代码的重用性,所以我们将会在User模型中实现follow和unfollow函数,而不是在视图函数中。这种方式不仅可以让这个功能应用于真实的应用也能在单元测试中测试。原则上,从视图函数中移除应用程序的逻辑到数据模型中是一种好的方式。你们必须要保证视图函数尽可能简单,因为它能难被自动化测试。

下面是添加了添加和移除 ‘关注者’ 功能的User模型(文件app/models.py):

学习python flask之11:在你的网站中实现用户之间的关注功能

从关注的用户那里获得博文

一般用户登录博客网站,首先看到的是他所关注的用户和自己的博文。最明显的方案是通过查询返回当前用户关注的用户(user.followed.all()),然后针对每个关注的用户查询他发布的博文,最后把这些用户的博文合并到一个单链表,并且根据日期排序。这听起来逻辑没错,但不现实。为啥呢?

假如登录用户关注了上千的用户咋办?上万个呢?按照上面的逻辑执行,效率太低。

实际中,博文的显示一般会分页,如果按照上面的逻辑运行一边,可能90%以上的工作白做了。

最终的解决方案,应该是查询数据库时通过设置必要的查询条件,使得该查询只返回足够的博文,然后我们直接显示在页面上即可。具体代码如下:

学习python flask之11:在你的网站中实现用户之间的关注功能

让我们来分解这个查询。它一共有三部分:连接,过滤以及排序。

Post.query.join(followers,

(followers.c.followed_id == Post.user_id))

连接操作所做的就是创建一个数据来自于Post和followers表的临时新的表,根据给定条件进行整合。连接完成后的表的每一项都包含了post和followers两个表的所有列。

在这个例子中,我们要followers表中的字段followed_id与Post表中的字段user_id相匹配。

过滤

filter(followers.c.follower_id == self.id)

这条过滤语句就是过滤出关联者为自己的所有项。

排序很好理解,就是根据时间顺序排列。

order_by(Post.timestamp.desc())

最后,由于显示的博文一般都包含自己的博文,实现时可以把自己添加为自己的关注者即可。

关注和取消关注的实现比较简单,主要是对数据库进行操作,如下所示:

学习python flask之11:在你的网站中实现用户之间的关注功能


分享到:


相關文章: