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字符串连接方法分析
Apr 12 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
详解Python中的四种队列
May 21 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
django form和field具体方法和属性说明
Jul 09 Python
Python标准库之typing的用法(类型标注)
Jun 02 Python
Python 数据可视化之Seaborn详解
Nov 02 Python
Python语言内置数据类型
Feb 24 Python
Python必备技巧之函数的使用详解
Apr 04 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
用PHP调用数据库的存贮过程!
2006/10/09 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
python使用thrift教程的方法示例
2019/03/21 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
《在山的那边》教学反思
2014/02/23 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
售房协议书
2014/08/19 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
2014年党建工作总结
2014/11/11 职场文书
党员年度个人总结
2015/02/14 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
电话营销开场白
2015/05/29 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers