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操作串口的方法
Jun 17 Python
python字符类型的一些方法小结
May 16 Python
浅析Python的web.py框架中url的设定方法
Jul 11 Python
Python中函数参数匹配模型详解
Jun 09 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
详解Python中namedtuple的使用
Apr 27 Python
Python利用myqr库创建自己的二维码
Nov 24 Python
用python制作个视频下载器
Feb 01 Python
python实现简易名片管理系统
Apr 11 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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 多个submit提交表单 处理方法
2009/07/07 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python模拟enum枚举类型的方法小结
2015/04/30 Python
python保存网页图片到本地的方法
2018/07/24 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
python虚拟环境完美部署教程
2019/08/06 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
新锐科技Java程序员面试题
2016/07/25 面试题
精选干货:Java精选笔试题附答案
2014/01/18 面试题
儿子婚宴答谢词
2014/01/09 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
保护水资源的标语
2014/06/17 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
技能培训通讯稿
2015/07/18 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS