一、概述在第二部分中 。我将讨论如何使用模板 。
学习完第一章之后 。你已经拥有了一个虽然简单 。但是可以成功运行Web应用 。它的文件结构如下:
microblogvenvapp__init__.pyroutes.pymicroblog.py
在终端会话中设置环境变量FLASK_APP=microblog.py 。然后执行flask run命令来运行应用 。包含这个应用的Web服务启动之后 。你可以通过在Web浏览器的地址栏中键入URL http://localhost:5000/ 来验证 。
本章将沿用这个应用 。在此之上 。你将学习如何生成包含复杂结构和诸多动态组件的网页 。如果对这个应用和相关开发流程有所遗忘 。请回顾第一章 。
二、什么是模板?我设计的微博应用程序的主页会有一个欢迎用户的标题 。虽然目前的应用程序还没有实现用户概念 。但这不妨碍我使用一个Python字典来模拟一个用户 。如下所示:
user={'username':'Miguel'}
创建模拟对象是一项实用的技术 。它可以让你专注于应用程序的一部分 。而无需为系统中尚不存在的其他部分分心 。在设计应用程序主页的时候 。我可不希望因为没有一个用户系统来分散我的注意力 。因此我使用了模拟用户对象 。来继续接下来的工作 。
原先的视图函数返回简单的字符串 。我现在要将其扩展为包含完整html页面元素的字符串 。如下所示:
fromappimportapp@app.route('/')@app.route('/index')defindex():user={'username':'Miguel'}return'''<html><head><title>HomePage-Microblog</title></head><body><h1>Hello,'''+user['username']+'''!</h1></body></html>
运行flask run 更新视图功能 。并查看应用程序在浏览器中的显示效果 。
文章插图
文章插图
利用上述的代码更新这个视图函数 。然后再次在浏览器打开它的URL看看结果 。
如果我说这个函数返回HTML的方式并不友好的话 。你可能会觉得诧异 。设想一下 。当这个视图函数中的用户和博客不断变化时 。里面的代码将会变得多么的复杂 。应用的视图函数及其关联的URL也会持续增长 。如果哪天我决定更改这个应用的布局 。那就不得不更新每个视图函数的HTML字符串 。显然 。随着应用的扩张 。这种方式完全不可行 。
将应用程序的后台逻辑和网页布局划分开来 。你不觉得更容易组织管理吗?甚至你可以聘请一位Web设计师来设计一个杀手级的网站前端 。而你只需要用Python编写后台应用逻辑 。
模板有助于实现页面展现和业务逻辑之间的分离 。在Flask中 。模板被编写为单独的文件 。存储在应用程序包内的templates文件夹中 。在确定你在microblog目录后 。创建一个存储模板的目录:
在Flask中 。模板是作为单独的文件编写的 。存放在应用程序 包内的 templates文件夹(约定俗成命名为 templates)下 。
即在app目录下创建templates文件夹:
#mkdirtemplates
在下面可以看到你的第一个模板 。它的功能与上面的index()视图函数返回的HTML页面相似 。把这个文件写在app/templates/index.html中:
<html><head><title>{{title}}-Microblog</title></head><body><h1>Hello,{{user.username}}!</h1></body></html>
这是一个标准的、简单的HTML页面 。但有一点跟我们写HTML代码不同是title标签、h1标签中的 {{ … }}两对花括号 。在此它是个 占位符 。作用是将表达式(如文字、数学式子、比较运算符等 。其实在Python中是一个Python语句)打印到模板进行输出 。具体参考Jinja2官网文档 。这些占位符表示HTML页面中可变的部分 。并且只在运行时才知道 。
这个HTML页面看起来非常简单 。唯一值得关注的地方是{{ … }} 。{{ … }}包含的内容是动态的 。只有在运行时才知道具体表示成什么样子 。
网页渲染转移到HTML模板之后 。视图函数就能被简化:现在HTML页面的呈现已在HTML模板中了 。这样接着就可简化一下视图函数index()了 。修改routes.py文件app/routes.py:使用render_template()函数
fromappimportappfromflaskimportrender_template#从flask包中导入render_template函数@app.route('/')@app.route('/index')defindex():user={'username':'Miguel'}returnrender_template('index.html',title='Home',user=user)
将模板(index.html)转换为完整HTML页面的操作称之为 呈现(render 。译作 递交、表达、给予 。在此译作 “渲染”) 。为了渲染模板 。由从flask包中导入的render_template()完成 。此函数“携带”模板文件名(index.html)、模板参数的变量列表 。并返回相同的模板 。不过其中所有占位符都替换为实际值 。
推荐阅读
- 特朗普起诉书启封后,两名律师辞职了
- IG冠军皮肤价格过于良心,令玩家难以适应,“美服日服玩家心都在滴血”,你觉得如何?
- 为上清华15次参加高考!他最新回应:真没有那个实力
- 把微信好友删了,对方是否还显示聊天记录?
- 淘宝站内推广方式有哪些 教你淘宝店铺怎么推广和引流
- 西瓜放水里泡一夜会坏吗 西瓜泡水里一晚上会坏吗
- ecmo开机费为什么那么贵 ecmo开机费为什么这么贵
- FPX冠军荣耀宝箱,5星任务翻车不断,4星反而质量更好,包含数款终极皮肤,你怎么看?
- 微信被删除后还能看到对方的朋友圈状态,这是怎么回事?