【Flask教程11】模板

  • 基本使用
  • 过滤器&自定义过滤器
  • 控制代码块
  • 宏、继承、包含
  • Flask 的模板中特有变量和方法
  • web表单
  • CSRF

学习目标

  • 能够写出 jinja2 中变量代码块和控制代码块的格式
  • 能够写出在模板中字典,列表的取值方式
  • 能够写出数组反转的自定义过滤器(使用1种方式即可)
  • 能够说出Flask中模板代码复用的三种方式
  • 能够使用代码实现模板继承的功能
  • 能够说出可以在模板中直接使用的 Flask 变量和函数
  • 能够使用 Flask-WTF 扩展实现注册表单
  • 能够说出 CSRF 攻击的原理

一、Jinja2模板引擎简介

模板

在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求。

实际上,视图函数有两个作用:处理业务逻辑返回响应内容

在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。

本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。

  • 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
  • 使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”
  • Flask是使用 Jinja2 这个模板引擎来渲染模板

使用模板的好处:

  • 视图函数只负责业务逻辑和数据处理(业务逻辑方面)
  • 而模板则取到视图函数的数据结果进行展示(视图展示方面)
  • 代码结构清晰,耦合度低

Jinja2

两个概念:

  • Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
  • 模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名

渲染模版函数

  • Flask提供的 render_template 函数封装了该模板引擎
  • render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

使用

  • {{}} 来表示变量名,这种 {{}} 语法叫做变量代码块
<h1>{{ post.title }}</h1>

Jinja2 模版中的变量代码块可以是任意 Python 类型或者对象,只要它能够被 Python 的 str() 方法转换为一个字符串就可以,比如,可以通过下面的方式显示一个字典或者列表中的某个元素:

{{your_dict[‘key‘]}}
{{your_list[0]}}
  • 用 {%%} 定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句
{% if user %}
    {{ user }}
{% else %}
    hello!
<ul>
    {% for index in indexs %}
    <li> {{ index }} </li>
    {% endfor %}
</ul>

注释

  • 使用 {# #} 进行注释,注释的内容不会在html中被渲染出来
{# {{ name }} #}

二、模板的使用

  • 在项目下创建 templates 文件夹,用于存放所有的模板文件,并在目录下创建一个模板html文件 temp_demo1.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
我的模板html内容
</body>
</html>
  • 设置 templates 文件夹属性以便能够在代码中有智能提示

  • 设置 html 中的模板语言,以便在 html 有智能提示

  • 创建视图函数,将该模板内容进行渲染返回
@app.route(‘/‘)
def index():
    return render_template(‘temp_demo1.html‘)

访问:http://127.0.0.1:5000/ 运行测试

  • 代码中传入字符串,列表,字典到模板中
@app.route(‘/‘)
def index():
    # 往模板中传入的数据
    my_str = ‘Hello 博客园‘
    my_int = 10
    my_array = [3, 4, 2, 1, 7, 9]
    my_dict = {
        ‘name‘: ‘xiaoming‘,
        ‘age‘: 18
    }
    return render_template(‘temp_demo1.html‘,
                           my_str=my_str,
                           my_int=my_int,
                           my_array=my_array,
                           my_dict=my_dict
                           )
  • 模板中代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
<br/>{{ my_array }}
<br/>{{ my_dict }}

</body>
</html>
  • 运行效果
<!DOCTYPE html>

我的模板html内容
Hello 黑马程序员
10
[3, 4, 2, 1, 7, 9]
{‘name‘: ‘xiaoming‘, ‘age‘: 18}
  • 相关运算,取值
<br/> my_int + 10 的和为:{{ my_int + 10 }}
<br/> my_int + my_array第0个值的和为:{{ my_int + my_array[0] }}
<br/> my_array 第0个值为:{{ my_array[0] }}
<br/> my_array 第1个值为:{{ my_array.1 }}
<br/> my_dict 中 name 的值为:{{ my_dict[‘name‘] }}
<br/> my_dict 中 age 的值为:{{ my_dict.age }}
  • 结果
my_int + 10 的和为:20
my_int + my_array第0个值的和为:13
my_array 第0个值为:3
my_array 第1个值为:4
my_dict 中 name 的值为:xiaoming sort:列表排序
 

原文地址:https://www.cnblogs.com/zeug/p/11367486.html

时间: 2024-10-07 10:47:02

【Flask教程11】模板的相关文章

Django[11]模板Template context和Bootstrap使用

视图views.py中: 1234567891011121314151617181920212223242526 from __future__ import unicode_literals from django.shortcuts import render # Create your views here.from django.http import HttpResponse def (request): context = { "title": "home&quo

Flask教程 —— Web表单(上)

第二章中介绍的request对象公开了所有客户端发送的请求信息.特别是request.form可以访问POST请求提交的表单数据. 尽管Flask的request对象提供的支持足以处理web表单,但依然有许多任务会变得单调且重复.表单的HTML代码生成和验证提交的表单数据就是两个很好的例子. Flask-WTF扩展使得处理web表单能获得更愉快的体验.该扩展是一个封装了与框架无关的WTForms包的Flask集成. Flask-WTF和它的依赖集可以通过pip来安装: (venv) $ pip

flask之二 模板相关

flask之二 模板相关 预热 在渲染模板的时候,默认会从项目根路径下的templates目录下查找模板 如果想要指定模板路径的时候,就在初始化APP的时候,这样操作即可: app = Flask(__name__,template_folder='C:/templates') #template_folder可以指定模板位置 模板传参 在使用render_template渲染模板的时候,可以传递关键字参数,以后直接在模板中使用就可以了 如果参数过多的话,那么就可以将所有的参数放到一个字典中,然

【v2.x OGE教程 11】 动画编辑器帮助文档

[v2.x OGE教程 11] 动画编辑器帮助文档 版本号 日期 作者 说明 1.0 2014-9-3 橙子游戏 文档创建       一.简单介绍 动画编辑器用于游戏动画的可视化编辑,支持序列帧动画和关键帧动画.通过解析生成的数据文件就可以获取动画信息,并能随时调整,以降低开发工作量.提高开发效率. 二.相关概念 1. 帧 帧是动画在某个时间点的状态.一系列的帧组成了动画的时间线.动画播放时.通过帧的切换,实现动画效果 2. 序列帧 序列帧组成序列帧动画,这样的动画中.仅通过静态图片的切换来实

python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器

python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 注: 本节代码是基于 Django 1.8,但 Django 1.4 - Djagno 1.9 操作流程也是一样的. 后文给出示例代码可以在 Django 1.4.x 到 Django 1.9.x 上运行. 不过还是强调一点,一点要动手敲代码!不要偷懒哦,动手才能学到真东西. 1. 创建一个 zqxt_tmpl 项目,和一个 名

quick-cocos2d-x教程11:实现http通信,并与网站php对接,可实现登录等常见功能

手机游戏目前是弱联网居多,http登录是常用功能.我们现在就来实现. 在启动时候,自动请求http. function MainScene:ctor() local url = "http://localhost/request.php" local request = network.createHTTPRequest(onRequestFinished, url, "POST") request:addPOSTValue("KEY", &qu

flask中jinjia2模板引擎使用详解4

接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下: {% %} {% %}      {% %}      <>{{ }}</>      {% %} {% %} 在code.py中添加url规则 @app.route() renderList():      users = [,,]      render_template(,users = users

flask中jinjia2模板引擎详解4

接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下{% extends "base.html" %} {% block content %}     {% for user in users %}     <li>{{ user }}</li>     {% endfor %} {% endblock %} 在code.py中添加url规

Flask 的 template模板 与 jinja2语法

Flask 的 template模板 与 jinja2语法 Flask使用的是Jinja2模板,所以其语法和Django基本无差别 1.模板基本数据的渲染 变量 {{..}} 列表 {% for item in List %}<li>{{item}}</li>{% endfor %} 字典 {% for k,v in Dict.items() %}<li>{{k}}{{v}}</li>{% endfor %} 2 注意:Markup等价django的mark