user.html模板如下所示:
{% extends "base.html" %}
{% block content %}
<h1>User: {{ user.username }}</h1>
<hr>
{% for post in posts %}
<p>
{{ post.author.username }} says: <b>{{ post.body }}</b>
</p>
{% endfor %}
{% endblock %}
然后创建视图函数user:
@app.route('/user/<username>')#本例中被<和>包裹的URL <username>是动态的。当一个路由包含动态组件时,Flask将接受该部分URL中的任何文本,并将以实际文本作为参数调用该视图函数。 例如,如果客户端浏览器请求URL /user/susan,则视图函数将被调用,其参数username被设置为'susan'
@login_required#因为这个视图函数只能被已登录的用户访问,所以我添加了@login_required装饰器。
def user(username):
user = User.query.filter_by(username=username).first_or_404()#我首先会尝试在数据库中以用户名来查询和加载用户。first_or_404(),当有结果时它的工作方式与first()完全相同,但是在没有结果的情况下会自动发送404 error给客户端。当用户名不存在于数据库中时,函数将不会返回,而是会引发404异常。 如果执行数据库查询没有触发404错误,那么这意味着找到了具有给定用户名的用户。
posts = [
{'author': user, 'body': 'Test post #1'},
{'author': user, 'body': 'Test post #2'}
]#为这个用户初始化一个虚拟的用户动态列表
return render_template('user.html', user=user, posts=posts)#用传入的用户对象和用户动态列表渲染一个新的user.html模板
在base.html添加个人主页入口链接,以便用户轻松查看自己的个人资料。
Microblog:
<a href="{{ url_for('index') }}">Home</a>
{% if current_user.is_anonymous %}
<a href="{{ url_for('login') }}">Login</a>
{% else %}
<a href="{{ url_for('user', username=current_user.username) }}">Profile</a># 由于个人主页视图函数接受一个动态参数,所以url_for()函数接收一个值作为关键字参数.由于这是一个指向当前登录个人主页的链接,我可以使用Flask-Login的current_user对象来生成正确的URL。
<a href="{{ url_for('logout') }}">Logout</a>
{% endif %}