摘要:使用真实值替代变量,再返回最终得到的响应字符串,这一过程成为渲染。渲染模板渲染模板提供的函数把模板引擎集成到了程序中。随后的参数都是键值对,表示模板中变量对应的真实值。程序现在使用的模板继承自不是直接继承自的基模板。
本系列笔记是我阅读Miguel Grinberg的《Flask Web Development》的笔记,标题与书本同步。希望通过记录技术笔记的方式促进自己对知识的理解。
本篇对应书本第三章:模板。
Jinja2模板引擎模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替代变量,再返回最终得到的响应字符串,这一过程成为渲染。
Flask渲染模板使用的是Jinja2模板引擎。
渲染模板hello.py 渲染模板
from flask import Flask,render_template
#...
@app.route("/")
def index():
return render_template("index.html")
@app.route("/user/")
def user(name):
return render_template("user.html",name=name)
# Flask提供的render_template函数把Jinja2模板引擎集成到了程序中。
# render_template函数的第一个参数是模板的文件名。
# 随后的参数都是键值对,表示模板中变量对应的真实值。
变量
模板中使用的{{ name }}结构表示一个变量,它是一种特殊的占位符,告诉模块引擎这个位置的值从渲染模板时使用的数据中获取。
Jinja2能识别所有类型的变量,示例:
变量过滤器A value from a dictionary:{{ mydict["key"]}}.
A value from a list:{{ mylist[3]}}.
A value from a list,with a variable index:{{ mylist[myintvar] }}.
A value from an object"s method: {{ myobj.somemethod() }}.
过滤器名添加在变量之后,中间使用竖线分隔。
hello, {{ name|capitalize }}
常用过滤器:
| 过滤器名 | 说明 |
|---|---|
| safe | 渲染值时不转义 |
| capitalize | 把值得首字母转换成大写,其他字母转换成小写 |
| lower | 把值转换成小写形式 |
| upper | 把值转换成大写形式 |
| title | 把值中每个单词的首字母都换成大写 |
| trim | 把值的首位空格去掉 |
| striptags | 渲染之前把值中所有的HTML标签都删掉 |
{% if user %}
Hello,{{ user }}!
{% else %}
Hello, Stranger!
{% endif %}
渲染一组元素
{{% macro render_comment(comment)%}}
{% include "common.html" %}
模板继承
- 建一个名为base.html的基模板
{% block head %}
{% block title %}{% endblock %} - My Application
{% endblock %}
{% block body %}
{% endblock %}
- 衍生模板中修改block标签定义的元素
{% extends "base.html" %} #定义基模板
{% block title%}Index{% endblock %} #修改title块内容
{% block head %} #修改head块内容
{{ super() }} #原来head中有内容,用super()获取原来的内容
{% endblock %}
{% block body %} #修改body块内容
Hello, World!
{% endblock %}
使用Flask-Bootstrap集成Twitter Bootstrap
安装Flask-Bootstrap扩展Bootstrap是Twitter开发的一个开源框架,它提供用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代Web浏览器。Bootstrap是客户端框架,不会直接涉及服务器。可以在模板中引用Bootstrap的CSS和JavaScript文件。
(venv)$ pip install flask-bootstrap hello.py: 初始化Flask-Bootstrap from falsk_bootstrap import Bootstrap # ... bootstrap = Bootstrap(app)使用Flask-Bootstrap的模板
{% extends "bootstrap/base.html" %}
{% block title%}Flasky{% endblock %}
{% block navbar %}
{% endblock %}
{% block content %}
Hello,{{ name }}!
{% endblock %}
# 模板利用Bootstrap中的样式进行了修改
Flask-Bootstrap基模板中定义的块
| 块名 | 说明 |
|---|---|
| doc | 整个HTML文档 |
| html_attribs | 标签的属性 |
| html | 标签中的内容 |
| head | 标签中的内容 |
| title | |
| metas | 一组标签 |
| styles | 层叠样式表定义 |
| body_attribs | 标签的属性 |
| body | 标签中的内容 |
| navbar | 用户定义的导航条 |
| content | 用户定义的页面内容 |
| scripts | 文档底部的JavaScript声明 |
利用Jinja2的模板继承机制可以让templates/base.html继承自bootstrap/base.html。
{% extends "bootstrap/base.html" %} {% block title %}Flasky{% endblock %} {% block navbar %} {% endblock %} {% block content %}{% block page_content %}{% endblock %}{% endblock %}程序现在使用的模板继承自templates/base.html不是直接继承自Flask-Bootstrap的基模板。
404错误页面:继承自templates/base.html
{% extends "base.html" %}
{% block title %}Flasky - Page Not Found{% endblock %}
{% block page_content %}
Not Found
{% endblock %}
user页面:继承自templates/base.html
{% extends "base.html" %}
{% block title %}Flasky{% endblock %}
{% block page_content %}
Hello, {{ name }}!
{% endblock %}
链接
Flask提供了url_for()辅助函数,它可以使用程序URL映射中保存的信息生成URL。
url_for函数最简单的用法:以视图函数名作为参数,返回对应的URL。url_for("index")得到的结果是"/"
使用url_for生成动态地址时,将动态部分作为关键字参数传入。
url_for("user",name="john",_external=True)
函数能将任何额外参数添加到查询字符串中。
静态文件 使用Flask-Moment本地化日期和时间Flask-Moment是Flask的一个程序扩展,能够在浏览器中渲染日期和时间。
安装Flask-Moment
(venv)$ pip install flask-momenthello.py:初始化Flask-Moment
from flask_moment import Moment moment = Moment(app)templates/base.html: 引入 moment.js库
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
hello.py: 加入一个datetime变量
from date.time import datetime
@app.route("/")
def index():
return render_template("index.html",current_time=datetime.utcnow())
templates/index.html: 使用Flask-Moment渲染时间戳
The local date and time is {{ moment(current_time).format("LLL") }}.
That was {{ moment(current_time).fromNow(refresh=True) }}.
本文由 EverFighting 创作,采用 **[知识共享署名 3.0 中国大陆许可协议]
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/38104.html
摘要:我们的论坛项目就使用了该框架。此外,麦子学院也有一个入门视频教程,一共小时的视频教程,涵盖开发的方方面面,包括环境的搭建,语法介绍,项目结构的组织,全球化,单元测试等内容。博客地址更多阅读的机制三个框架的对比 前面两篇文章中我们已经了解 Web(HTTP)服务器,Web应用程序,Web框架,WSGI这些 Python Web 开发中的概念。我们知道,Web框架通过将不同Web应用程序中...
摘要:处理和函数之间关系的程序称为路由。模板引擎是由实现的是内置的模板语言参照设计思想设计的,跟差不多渲染模板默认情况下,在程序文件夹中的子文件夹中寻找模板。如果需要可在文件夹中使用子文件夹存放文件。 1 程序的基本结构 1.1初始化 所有Flask 程序都必须创建一个程序实例。Web 服务器使用一种名为Web 服务器网关接口(Web Server Gateway Interface,WSG...
摘要:和是最受欢迎的。虚拟环境将允许将项目依赖项与本地机器依赖项隔离开来。文件将是项目中的主文件。运行后,检查本地主机。在中创建一个名为的文件夹,并创建一个名为的文件夹。部署创建帐户为前端和全栈应用程序提供免费部署服务。 ...
摘要:简介官网上对它的定位是一个微开发框架。另外一个必须理解的概念是,简单来说就是一套和框架应用之间的协议。功能比较丰富,支持解析自动防止攻击继承变量过滤器流程逻辑支持代码逻辑集成等等。那么,从下一篇文章,我们就正式开始源码之旅了 文章属于作者原创,原文发布在个人博客。 flask 简介 Flask 官网上对它的定位是一个微 python web 开发框架。 Flask is a micro...
摘要:示例如下静态路由使用动态变量的路由未指定变量类型使用动态变量的路由指定变量类型指定的路由变量,可以作为被装饰的函数参数传入进来。 开始决定认真的在网上写一些东西,主要原因还是在于希望能提升学习效果。虽说python写了有几年,但是web后端框架的确没怎么接触过,买了本狗书寥寥草草的过了一遍,发现很多东西还是理解不深,真的是好记性不如烂笔头,知识也要从基础开始,退回来好好看看官方文档,再...
阅读 1847·2023-04-26 02:50
阅读 3837·2023-04-26 00:28
阅读 2228·2023-04-25 15:18
阅读 3466·2021-11-24 10:31
阅读 1256·2019-08-30 13:00
阅读 1268·2019-08-29 15:19
阅读 2024·2019-08-29 13:09
阅读 3252·2019-08-29 13:06