四、模板

FMTV

F:form表单

M:Model模型(数据库)

T:Template模板

V:view视图(路由)

1、渲染模板

模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值

只在请求的上下文中才能知道。 使用真实值替换变量,再返回最终得到的响应字符

串,这一过程称为渲染。可以使用 render_template() 方法来渲染模板。你需要做

的一切就是将模板名和你想作为关键字的参数传入模板的变量。

Flask 会在 templates 文件夹里寻找模板。所以,如果你的应用是个模块,这个文

件夹应该与模块同级;如果它是一个包,那么这个文件夹作为包的子目录:

模板:

/application.py

/templates

/hello.html

包:

/application

/__init__.py

/templates

/hello.html

【hello.html】

Hello World!

from flask import render_template

@app.route('/hellotemplate/')

def hellotemplate():

return render_template('hello.html')

模板引擎

Flask使用了一个名为 Jinja2 的强大模板引擎

{% ... %} Jinja语句,例如判断、循环语句

{{ ... }} 变量,会显示在浏览器中

{# ... #} 注释,不会输出到浏览器中

2、变量规则

在模板中使用的 {{ name }} 结构表示一个变量,它是一种特殊的占位符,告诉

模板引擎这个位置的值从渲染模板时使用的数据中获取。

【helloname.html】

Hello, {{ name }}!

@app.route('/hellotemplate/')

def helloname(name):

return render_template('helloname.html',name = name)

可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。

3、控制结构

1、条件控制语句

【if.html】

{% if name %}

hello, {{name}}

{% else %}

hello, world!

{% endif %}

2、 for 循环

【for.html】

{% for a in range(10) %}

a

{% endfor %}

@app.route('/for/')

def fortemplate():

return render_template('for.html')

3、Jinja2 还支持宏(macro) 。宏类似于 Python 代码中的函数(def)。

【macro.html】

{% macro myprint(A) %}

this is {{ A }}

{% endmacro %}

{{ myprint(A) }}

@app.route('/macro/')

def macrotamplate(a):

return render_template('macro.html',A = a)

为了重复使用宏,我们可以将其保存在单独的文件中,然后在需要使用的模板中导入:

【macro2.html】

{% from 'macro.html' import myprint %}

{{ myprint(A) }}

@app.route('/macro2/')

def macro2template(a):

return render_template('macro2.html',A = a)

4、包含(include)

【include.html】

{% include 'macro.html' %}

@app.route('/include/')

def includetemplate(a):

return render_template('include.html',A = a)

【注意】

包含进来的文件里的所有变量也包含进来了,需要在视图函数中指定

4、模板继承

首先,创建一个名为 base.html 的基模板:

【base.html】

{% block head %}

{% block title %}

{% endblock %}

- My Application

{% endblock %}

{% block body %}

{% endblock %}

block 标签定义的元素可在衍生模板中修改。下面这个示例是基模板的衍生模板:

【extend.html】

% extends "base.html" %}

{% block title %}Index{% endblock %}

{% block head %}

{{ super() }}

super

{% endblock %}

{% block body %}

Hello, World!

{% endblock %}

extends 指令声明这个模板衍生自 base.html。在 extends 指令之后,基模板中的

3个块被重新定义,模板引擎会将其插入适当的位置。如果想添加内容到在父模板

内已经定义的块,又不想失去父模板里的内容,可以使用super函数

5、使用Flask-Bootstrap

Flask-Bootstrap 使用 pip安装:

(venv) $ pip install flask-bootstrap

Flask 扩展一般都在创建程序实例后就初始化。

初始化 Flask-Bootstrap 之后,就可以在程序中使用一个包含所有 Bootstrap 文件

的基模板。

【boootstrap.html】

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block navbar %}

data-toggle="collapse" data-target=".navbar-collapse">

Toggle navigation

Flasky

  • Home

{% endblock %}

{% block content %}

Hello, {{ name }}!

{% endblock %}

Jinja2 中的 extends 指令从 Flask-Bootstrap 中导入 bootstrap/base.html,从而

实现模板继承。

Flask-Bootstrap 中的基模板提供了一个网页框架,引入了 Bootstrap 中的所有 CSS

和JavaScript 文件。基模板中定义了可在衍生模板中重定义的块。 block 和 endblock

指令定义的块中的内容可添加到基模板中。

上面这个 boootstrap.html 模板定义了 3 个块,分别名为 title、 navbar 和 content。

这些块都是基模板提供的, 可在衍生模板中重新定义。 title 块的作用很明显,其中

的内容会出现在渲染后的 HTML 文档头部,放在

标签中。 navbar 和 content

这两个块分别表示页面中的导航条和主体内容。在这个模板中, navbar 块使用 Bootstrap

组件定义了一个简单的导航条。content 块中有个

容器,其中包含一个页面头部。

之前版本的模板中的欢迎信息,现在就放在这个页面头部。

from flask_bootstrap import Bootstrap

bootstrap = Bootstrap(app)

@app.route('/bootstrap/')

def bootstraptemplate(name):

return render_template('boootstrap.html',name = name)

【注意】

很多块都是 Flask-Bootstrap 自用的,如果直接重定义可能会导致一些问题。例如,

Bootstrap 所需的文件在 styles 和 scripts 块中声明。如果程序需要向已经有内

容的块中添加新内容,必须使用Jinja2 提供的 super() 函数。例如,如果要在衍生

模板中添加新的 JavaScript 文件,需要这么定义 scripts 块:

{% block scripts %}

{{ super() }}

{% endblock %}

6、自定义错误页面

【templates/404.html】

Page is not Found

@app.errorhandler(404)

def page_not_found(e):

return render_template('404.html'), 404

【templates/base.html: 包含导航条的程序基模板】

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block head %}

{{ super() }}

{% endblock %}

{% block navbar %}

Toggle navigation

Flasky

  • Home

{% endblock %}

{% block content %}

{% block page_content %}{% endblock %}

{% endblock %}

{% block scripts %}

{{ super() }}

{{ moment.include_moment() }}

{% endblock %}

这个模板的 content 块中只有一个

容器,其中包含了一个名为

page_content 的新的空块,块中的内容由衍生模板定义。

【templates/404.html:使用模板继承机制自定义 404 错误页面】

{% extends "base.html" %}

{% block title %}Flasky - Page Not Found{% endblock %}

{% block page_content %}

Not Found

{% endblock %}

templates/boootstrap.html 现在可以通过继承这个基模板来简化内容:

【 templates/boootstrap.html: 使用模板继承机制简化页面模板】

{% extends "base.html" %}

{% block title %}Flasky{% endblock %}

{% block page_content %}

Hello, {{ name }}!

{% endblock %}

7、静态文件

默认设置下, Flask 在程序根目录中名为 static 的子目录中寻找静态文件。

如果需要,可在static 文件夹中使用子文件夹存放文件。给静态文件生成

URL ,使用特殊的 'static' 端点名:

【westeros.html】

@app.route('/westeros/')

def westeros():

return render_template('westeros.html')

这个文件应该存储在文件系统上的 static/westeros.jpg 。

8、使用Flask-Moment本地化日期和时间

lask-Moment 是一个 Flask 程序扩展,能把moment.js 集成到 Jinja2 模

板中。 Flask-Moment 可以使用 pip 安装:

(venv) $ pip install flask-moment

这个扩展的初始化方法和Bootstrap一样,以程序实例app为参数:

from flask_moment import Moment

moment = Moment(app)

除了 moment.js, Flask-Moment 还依赖 jquery.js。要在 HTML 文档的某个

地方引入这两个库,可以直接引入,这样可以选择使用哪个版本,也可使用扩

展提供的辅助函数,从内容分发网络(Content Delivery Network, CDN)中

引入通过测试的版本。 Bootstrap 已经引入了 jquery.js, 因此只需引入

moment.js即可。

【base.html中增加了】

{% block scripts %}

{{ super() }}

{{ moment.include_moment() }}

{% endblock %}

【moment.html】

{% extends "base.html" %}

{% block page_content %}

Hello World!

The local date and time is {{moment(current_time).format('LLL')}}.

That was {{moment(current_time).fromNow(refresh = true)}}.

{% endblock %}

把变量current_time 传入模板进行渲染

from datetime import datetime

@app.route('/moment/')

def momenttemplate():

return render_template('moment.html',current_time = datetime.utcnow())

flask 模板 php,Flask四之模板相关推荐

  1. 提高开发效率之安卓模板(上面有四种模板的教程,我之前会两种,看完之后还是只会两种2333)

    原文地址: juejin.im/post/5c7339- 在平时的开发工作中,我们经常将一个地方的代码,复制粘贴到另外一个地方,俗称搬砖,搬砖搬多了,作为一个资深的挨踢民工,难免会总结一些提高生产力的 ...

  2. Flask框架四:模板继承以及豆瓣案例

    1.模板继承 ①为什么会有模板继承而不用include调用模板:include是引用模板的标签,将模板的内容直接显示,但是当页面有变化的时候,比如多了一个侧边栏的内容,或者想改输入框为按钮,这时候就要 ...

  3. flask第二十四篇——模板【6】自定义过滤器

    请关注孟船长的公众号:自动化测试实战 大家想了解其他过滤器可以参考这里: http://jinja.pocoo.org/docs/dev/templates/#builtin-filters ---- ...

  4. Python Flask Web 第四课 —— 模板引擎Jinja2

    1. 基本介绍 形式最为简单的 Jinja2 模板是一个包含响应文本的文件. templates/index.html <h1>Hello World!</h1> 既然是模板, ...

  5. flask 模板 php,Flask 模板系统

    模板 基本数据类型 可以执行python语法,如:dict.get(), list['xx'] 比django 更加亲近于 python 传入函数 - django,自动执行 - flask,不自动执 ...

  6. Flask Web开发——(二)模板

    视图函数的作用是生成请求的响应.很多情况下,请求会改变应用的状态,而这种变化就发生在视图函数中. 以用户在网站中注册新账户的过程为例.用户在表单中输入电子邮件地址和密码,然后提交.服务器接收到包含用户 ...

  7. flask html 模板继承,Flask框架模板继承实现方法分析

    Flask框架模板继承实现方法分析 本文实例讲述了Flask框架模板继承实现方法.分享给大家供大家参考,具体如下: 在模板中,可能会遇到以下情况: 多个模板具有完全相同的顶部和底部内容 多个模板中具有 ...

  8. 第十阶段 -- Flask框架03:【Jinja2模板01:模板;过滤器;控制语句if for】

    文章目录 1. Jinja2模板介绍和查找路径 2. 模板传参及其技巧 3. 模板中使用url_for 4. Jinja2过滤器 1. 基本使用 2. 过滤器介绍 3. default详解 4. 常用 ...

  9. Flask学习之旅——2.1 模板简介及基础使用

    Flask学习之旅--2.1 模板简介及基础使用 前言 本文为<知了传课--模板简介>的学习笔记. 原文地址:第一节:模板简介 - Python框架Flask基础教程 - 知了传课 (zl ...

最新文章

  1. aws lambda使用_使用AWS Lambda安排Slack消息
  2. 安装NodeJS环境报错
  3. Windows Phone 7 WebBrowser 中文乱码问题
  4. php禁止组合热键,cad组合快捷键命令有哪些
  5. iptables利用ipt_recent做防刷限制
  6. Go语言 读写锁互斥锁原理剖析(1)
  7. .zip.001 -- .zip.003解压缩
  8. [VB]用记录集填充表格函数
  9. ecshop源码教程第1季
  10. Matlab经纬度坐标转换xy坐标,经纬度坐标系转换为UTM坐标系(matlab)
  11. 低无代码开发平台正在逐渐打破原有软件开发模式
  12. QQ会员首页HTML+CSS
  13. win10截图相关教程
  14. 认知仿真:是复杂系统建模的新途径吗
  15. 开发板——在X210开发板上进行裸机开发的流程
  16. svnserve服务器
  17. CUDA 深入浅出谈
  18. 科技英语翻译计算机化考试,《信息科技英语翻译》期末考试 A卷参考答案
  19. 解决CentOS磁盘空间不足
  20. 卡尔曼滤波做轨迹预测

热门文章

  1. 数学建模债券投资组合_1998年全国大学生数学建模竞赛题目A题投资的收益和风险.PDF...
  2. python面试刷题app_Python面试的一些心得,与Python练习题分享
  3. 为什么要做电路保护,电路保护的意义是什么?
  4. AES加密算法的VHDL实现
  5. java在dos中如何测试_[求助]怎么在java中模拟dos命令行
  6. java有var吗_java – Var和Var之间的区别
  7. python控制modem的at指令_硬件设计MCU架构+Python命名空间和作用域
  8. java三目运算符嵌套_替代JS中的嵌套三元运算符
  9. nio的应用 java_Java NIO 在网络编程中的应用
  10. java集合set的使用_浅析Java中的set集合类型及其接口的用法