返回介绍

什么是模板?

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

我设计的微博应用程序的主页会有一个欢迎用户的标题。虽然目前的应用程序还没有实现用户概念,但这不妨碍我使用一个 Python 字典来 模拟 一个用户,如下所示:

user = {'username': 'Miguel'}

创建模拟对象是一项实用的技术,它可以让你专注于应用程序的一部分,而无需为系统中尚不存在的其他部分分心。 在设计应用程序主页的时候,我可不希望因为没有一个用户系统来分散我的注意力,因此我使用了模拟用户对象,来继续接下来的工作。

原先的视图函数返回简单的字符串,我现在要将其扩展为包含完整 HTML 页面元素的字符串,如下所示:

from app import app

@app.route('/')
@app.route('/index')
def index():
    user = {'username': 'miguel'}
    return '''
<html>
    <head>
        <title>Home Page - Microblog</title>
    </head>
    <body>
        <h1>Hello, ''' + user['username'] + '''!</h1>
    </body>
</html>'''

对 HTML 标记语言不熟悉的话,建议阅读一下 Wikipedia 上的简介 HTML Markup

利用上述的代码更新这个视图函数,然后再次在浏览器打开它的 URL 看看结果。

如果我说这个函数返回 HTML 的方式并不友好的话,你可能会觉得诧异。设想一下,当这个视图函数中的用户和博客不断变化时,里面的代码将会变得多么的复杂。应用的视图函数及其关联的 URL 也会持续增长。如果哪天我决定更改这个应用的布局,那就不得不更新每个视图函数的 HTML 字符串。显然,随着应用的扩张,这种方式完全不可行。

将应用程序的后台逻辑和网页布局划分开来,你不觉得更容易组织管理吗?甚至你可以聘请一位 Web 设计师来设计一个杀手级的网站前端,而你只需要用 Python 编写后台应用逻辑。

模板有助于实现页面展现和业务逻辑之间的分离。 在 Flask 中,模板被编写为单独的文件,存储在应用程序包内的 templates 文件夹中。 在确定你在 microblog 目录后,创建一个存储模板的目录:

(venv) $ mkdir app/templates

在下面可以看到你的第一个模板,它的功能与上面的 index() 视图函数返回的 HTML 页面相似。 把这个文件写在 app/templates/index.html 中:

<html>
    <head>
        <title>{{ title }} - Microblog</title>
    </head>
    <body>
        <h1>Hello, {{ user.username }}!</h1>
    </body>
</html>

这个 HTML 页面看起来非常简单,唯一值得关注的地方是 {{ ... }}{{ ... }} 包含的内容是动态的,只有在运行时才知道具体表示成什么样子。

网页渲染转移到 HTML 模板之后,视图函数就能被简化:

from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
    user = {'username': 'Miguel'}
    return render_template('index.html', title='Home', user=user)

看起来好多了吧? 赶紧试试这个新版本的应用程序,看看模板是如何工作的。 在浏览器中加载页面后,你需要从浏览器查看 HTML 源代码并将其与原始模板进行比较。

将模板转换为完整的 HTML 页面的操作称为 渲染 。 为了渲染模板,需要从 Flask 框架中导入一个名为 render_template() 的函数。 该函数需要传入模板文件名和模板参数的变量列表,并返回模板中所有占位符都用实际变量值替换后的字符串结果。

render_template() 函数调用 Flask 框架原生依赖的 Jinja2 模板引擎。 Jinja2 用 render_template() 函数传入的参数中的相应值替换 {{...}} 块。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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