个人主页
作为创建个人主页的第一步,让我们为其 URL /user/ 新建一个对应的视图函数。
@app.route('/user/<username>')
@login_required
def user(username):
user = User.query.filter_by(username=username).first_or_404()
posts = [
{'author': user, 'body': 'Test post #1'},
{'author': user, 'body': 'Test post #2'}
]
return render_template('user.html', user=user, posts=posts)
我用来装饰该视图函数的 @app.route
装饰器看起来和之前的有点不一样。 本例中被 <
和 >
包裹的 URL <username>
是动态的。 当一个路由包含动态组件时,Flask 将接受该部分 URL 中的任何文本,并将以实际文本作为参数调用该视图函数。 例如,如果客户端浏览器请求 URL /user/susan
,则视图函数将被调用,其参数 username
被设置为 'susan'
。 因为这个视图函数只能被已登录的用户访问,所以我添加了 @login_required
装饰器。
这个视图函数的实现相当简单。 我首先会尝试在数据库中以用户名来查询和加载用户。 之前你见过通过调用 all()
来得到所有的结果的查询,或是调用 first()
来得到结果中的第一个或者结果集为空时返回 None
的查询。 在本视图函数中,我使用了 first()
的变种方法,名为 first_or_404()
,当有结果时它的工作方式与 first()
完全相同,但是在没有结果的情况下会自动发送 404 error 给客户端。 以这种方式执行查询,我省去检查用户是否返回的步骤,因为当用户名不存在于数据库中时,函数将不会返回,而是会引发 404 异常。
如果执行数据库查询没有触发 404 错误,那么这意味着找到了具有给定用户名的用户。 接下来,我为这个用户初始化一个虚拟的用户动态列表,最后用传入的用户对象和用户动态列表渲染一个新的 user.html 模板。
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 %}
个人主页虽然已经完成了,但是网站上却没有一个入口链接。我将会在顶部的导航栏中添加这个入口链接,以便用户可以轻松查看自己的个人资料:
<div>
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>
<a href="{{ url_for('logout') }}">Logout</a>
{% endif %}
</div>
这里唯一有趣的变化是用来生成链接到个人主页的 url_for()
调用。 由于个人主页视图函数接受一个动态参数,所以 url_for()
函数接收一个值作为关键字参数。 由于这是一个指向当前登录个人主页的链接,我可以使用 Flask-Login 的 current_user
对象来生成正确的 URL。
尝试点击顶部的 Profile
链接就能将你带到自己的个人主页。 此时,虽然没有链接来访问其他用户的主页,但是如果要访问这些页面,则可以在浏览器的地址栏中手动输入网址。 例如,如果你在应用中注册了名为“john”的用户,则可以通过在地址栏中键入 http:// localhost:5000/user/john 来查看该用户的个人主页。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论