在首页显示所关注用户的文章
现在,用户可以选择在首页显示所有用户的博客文章还是只显示所关注用户的文章了,实现代码如下:
# app/main/views.py
@main.route('/', methods=['GET', 'POST'])
def index():
form = PostForm()
show_followed = False
if current_user.is_authenticated:
show_followed = bool(request.cookies.get('show_followed', ''))
if show_followed:
query = current_user.followed_posts
else:
query = Post.query
pagination = query.order_by(Post.timestamp.desc()).paginate(
page, per_page=current_app.config['FLASKY_POSTS_PER_PAGE'],
error_out=False)
posts = [pagination.items]
return render_template('index.html', form=form, posts=posts,
show_followed=show_followed,pagination=pagination)
#...
决定显示所有博客文章还是只显示所关注用户文章的选项存储在cookie的show_followed字段中,如果其值显示为非空字符串,则表示只显示所关注用户的文章,cookie以request.cookies
字典的形式存储在请求对象中,这个cookie的值会转换成布尔值,根据得到的值设定本地变量的query的值,query的值决定最终获取所有博客文章的查询,或是获取过滤后的博客文章查询,显示所有用户的文章时,要使用顶级查询Post.query,如果限制只显示所关注用户的文章,要使用User.followed_posts
属性,然后将本地变量query中保存的查询进行分页,像往常一样将其传入模板
show_followedcookie
在两个新路由中设定,代码如下:
# app/main/views.py
#...
@main.route('/all')
@login_required
def show_all():
resp = make_response(redirect(url_for('.index')))
resp.set_cookie('show_followed','', max_page=30*24*60*60)
return resp
@main.route('/followed')
@login_required
def show_followed():
resp = make_response(redirect(url_for('.index')))
resp.set_cookie('show_followed','1', max_page=30*24*60*60)
return resp
指向这两个路由的链接添加在页面模板中,点击这两个链接后会为show_followedcookie
设定适当的值,然后重定向到首页
cookie只能在相应对象中设置,因此这两个路由不能依赖Flask,要使用make_response()
方法创建响应对象
set_cookie()
函数的前两个参数分别是cookie名和值,可选的max_age
参数设置cookie的过期时间,单位为秒,如果不指定参数max_age
,浏览器关闭后cookie就会过期,在本例中,过期时间为30天,所以即便用户几天不访问程序,浏览器也会记住设定的值
接下来我们要对模板做些改动,在页面上部添加两个导航选项卡,分别调用/all
和/followed
路由,并在会话中设定正确的值
如果现在访问网站,切换到所关注用户文章列表,会发现自己的文章不在列表中,这是肯定的,因为用户不能关注自己
虽然查询能按设计正常执行,但用户查看好友文章时还是希望能看到自己的文章,这个问题的解决方式是,注册时把用户设为自己的关注者,实现如下:
# app/models.py
class User(UserMixin, db.Model):
#...
@staticmethod
def add_self_follows():
for user in User.query.all():
if not user.is_following(user):
user.follow(user)
db.session.add(user)
db.session.commit()
现在可以通过shell运行这个函数来更新数据库:
(env) PS D:\flasky> python manage.py shell
>>> User.add_self_follows()
创建函数更新数据库这一技术经常用来更新已部署的程序,因为运行脚本更新比手动更新数据库更少出错,以后在部署脚本的时候会使用这个函数以及类似函数
用户关注自己这一功能的实现让程序变得更实用,但也有一些副作用,因为用户自关注链接,用户资料页显示的关注者和被关注者的数量都增加了一个,为了显示准确,这些数字要减去1,这一点在模板中很容易实现,直接渲染{{ user.followers.count() -1 }}
和{{ user.followed.count() -1 }}
即可,然后还要调整关注用户和被关注用户的列表,不显示自己,这也是在模板中实现,使用条件语句即可,最后检查关注者数量的单元测试也会受到自关注的影响,必须做出调整,计入自关注