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实现将DOC文档转换为PDF的方法
Jul 25 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
python xpath获取页面注释的方法
Jan 14 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
用Python实现BP神经网络(附代码)
Jul 10 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python如果快速判断数字奇数偶数
Nov 13 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
python如何实现递归转非递归
Feb 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的类树(支持无限分类)
2006/10/09 PHP
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
python保存数据到本地文件的方法
2018/06/23 Python
python matlibplot绘制3D图形
2018/07/02 Python
Python实现网站表单提交和模板
2019/01/15 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
python 实现按对象传值
2019/12/26 Python
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
机修工岗位职责
2013/11/24 职场文书
前台接待员岗位职责
2014/01/02 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
老人祝寿主持词
2014/03/28 职场文书
学校文明单位申报材料
2014/05/06 职场文书
雷人标语集锦
2014/06/19 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
优秀团员个人总结
2015/02/26 职场文书
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS