flask框架渲染Jinja模板与传入模板变量操作详解


Posted in Python onJanuary 25, 2020

本文实例讲述了flask框架渲染Jinja模板与传入模板变量操作。分享给大家供大家参考,具体如下:

1. 模板简介

模板是一个web开发中必备的模块,因为我们在渲染一个网页的时候,并不只是渲染了一个纯文本字符窜,而是渲染一个有富文本标签的页面,这个时候我们就需要用到模板了。在flask中,配套的模板是Jinja2,Jinja2的作者也是flask的作者。

2. flask中渲染模板

在flask中,如果我们需要渲染一个模板,那么我们就需要用到render_template这个方法了。

在我们新建一个flask项目的时候,会同时生成一个templates的文件夹,然后我们就在里面新建一个index.html的文件。然后写入测试代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
 <h1>index</h1>
</body>
</html>

然后我们在app.py文件中写一个视图函数渲染我们的index.html文件。

from flask import render_template
@app.route('/index/')
def index():
  return render_template('index.html')

这样,我们就成功的对html页面进行了渲染。然后我们运行项目,输入网址就能够查看到效果了。

3. flask中模板文件查找路径

在上面的render_template函数中,为什么我们直接写入index.html,flask就会知道去templates文件夹里面去找这个文件呢。而不是去其他位置查找index.html文件呢。这是因为在flask中,默认的查找模板路劲就在项目的根目录下面的templates文件夹。所以当我们写模板文件的时候,都会写在templates下面。

在flask中,我们也是可以修改模板的存放位置的,比如我们将模板文件存放位置修改为E:\templates,那么我们就可以这样写。

from flask import Flask,render_template
app = Flask(__name__,template_folder=r'E:\templates')

这样,flask每次查找模板文件路径的时候,就回去这个文件夹下面寻找,如果没有找到,就会报一个jinja2.exceptions.TemplateNotFound的错误,所以,当我们遇到了这个错误的时候,我们就要知道是哪个位置出问题了。

4. 模板中传入参数

在一个模板中,我们不可避免的会传入一些参数,那么在flask中,应该怎样闯入参数呢。

首先编写一个视图,然后在render_template中传入一个关键字参数,例如下面的username=‘xxx'

from flask import render_template
@app.route('/index/')
def index():
  return render_template('index.html',username='xxx')

然后我们在模板中怎样使用这个变量呢?我们在index.html中写入以下代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
 <h1>index</h1>
 <p>userneme: {{ username }}</p>
</body>
</html>

所以,我们在模板中通过 {{ username }}就可以拿到我们冲视图中传入的值了。也就是说,在Jinja2模板中,是通过{{ 变量名 }}来获取数据的,如果我们在{{ }}中传入了一个视图并没有穿给我们的变量,那么也不会报错,只是什么都不显示而已。

如果我们需要传入多个参数,只需要依次在render_template函数中传入我们的关键之参数就可以了。
示例:

return render_template('index.html',username='xxx',age=18,...)

但是如果我们参数很多的话,那么这样我们也不方便我们管理和查看,这个时候我们就可以换一种方式了,定义一个字典,来存放所有的变量,然后在传入模板中

示例:

@app.route('/index/')
def index():
 context = {
 'username':'xxx',
 'age':18,
 'height':180,
 }
  return render_template('index.html',context=context)

但是这个时候,当我们在模板找中直接输入{{ username }},{{ age }}, {{ height }}的时候,是获取不到我们的数据的,因为我们使用这种方法的话,在模板中,获取参数就需要改变一下方式了。变成下面这样.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
 <h1>index</h1>
 <p>userneme: {{ context.username }}</p>
 <p>userneme: {{ context['age'] }}</p>
 <p>userneme: {{ context.height }}</p>
</body>
</html>

在上面模板中,我们使用了两种方式得到参数,context['username']和context.username。因为context是一个字典,所以使用这两种方法都是可以的。

但是这样我们仍然觉得不方便,每次都需要通过context才能获取到我们传入的参数。那么我们可不可以不通过context才能获取参数呢,答案是可以的。

实例:

@app.route('/index/')
def index():
 context = {
 'username':'xxx',
 'age':18,
 'height':180,
 }
  return render_template('index.html',**context)

我们在视图函数中这样写,我们就需要通过context才能得到我们的参数了。

**context其实就是将这个字典打撒开来,形成关键字参数。所以,他和下面这种写法是完全一样的。

@app.route('/index/')
def index():
  return render_template('index.html',username='xxx',age=18,height=180)

一般我们在项目的开发中,我们都是使用**context这种写法。

当然,在我们的实际开发中,传送的数据肯定不是这么简单,一般都有数据嵌套之类的,还有对象。
例如下面这样:

# 定义一个Person类
class Person():
  def __init__(self,name,age):
    self.name = name
    self.age = age
person = Person('小明', 18) # 实例化一个Person对象
@app.route('/')
def index():
  context = {
    'username':'xujin',
    'age':18,
    'children':{
      'name':'hah',
      'height':190,
    },
    'person':person,
    'list':[1,2,3]
  }
  return render_template('index.html',**context)

其实在Jinja2模板中,我们对数据的操作和在python都是差不多的,像上面这种数据,我们就可以通过下面的方式来获取。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
<h1>index</h1>
hello {{ username }}
<p> {{ children.name}} </p>
<p> {{ children['height'] }} </p>
{{ person }}
{{ person.name }}
{{ person.age }}
{{ list }}
{{ list[1] }}
</body>
</html>

5. url_for的使用

在模板中,我们一般也少不了需要url地址,而我们直接手动写入url地址的话,不方便我们后面的管理,所以一般我们都会使用url_for函数构造我们的url。

比如我们有一个login页面,然后我么需要从首页点击登录之后,就跳转至login页面,那么我们需要这样做。

@app.route('/login/')
def login():
  return "这是login页面"
@app.route('/index/')
def login():
  return render_template('index.html')

然后我们在index.html中写入

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
<h1>index</h1>
<p><a href="/login/" rel="external nofollow" >登陆</a></p>
<p><a href="{{ url_for('login') }}" rel="external nofollow" >登陆</a></p>
</body>
</html>

上面两种方式一种是直接写死url的方式,一种就是使用url_for的的方式。一般我们都是会使用url_for这种方式的。

如果我们的url需要参数,那么其实和在视图中传入参数是一样的。

示例:

@app.route('/user/<int:user_id>/')
def user(user_id):
 return "user id is %s " % user_id

模板文件中写入

<a href="{{ url_for('user',user_id=1,next='xxx') }}" rel="external nofollow" >user</a>
<!-- 等价于下面这样 -->
<a href="/user/1/?next=xxx" rel="external nofollow" >user</a>

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

Python 相关文章推荐
python分割文件的常用方法
Nov 01 Python
Python中title()方法的使用简介
May 20 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
Python OpenCV实现图片上输出中文
Jan 22 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
基于python plotly交互式图表大全
Dec 07 Python
python字典的值可以修改吗
Jun 29 Python
Python装饰器详细介绍
Mar 25 Python
如何在 Django 模板中输出 &quot;{{&quot;
Jan 24 #Python
在keras中获取某一层上的feature map实例
Jan 24 #Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 #Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 #Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 #Python
keras获得某一层或者某层权重的输出实例
Jan 24 #Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 #Python
You might like
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
php生成静态页面的简单示例
2014/04/17 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
2017/09/08 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
详解Vue中的自定义指令
2020/12/07 Vue.js
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
什么是URL
2015/12/13 面试题
机械设计制造专业个人求职信
2013/09/25 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers