返回介绍

个人主页

发布于 2025-01-02 21:53:50 字数 2691 浏览 0 评论 0 收藏 0

作为创建个人主页的第一步,让我们为其 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文