本文实例讲述了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/" rel="external nofollow" >user</a>
希望本文所述对大家基于flask框架的Python程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 明达年度发烧碟MasterSuperiorAudiophile2021[DSF]
- 英文DJ 《致命的温柔》24K德国HD金碟DTS 2CD[WAV+分轨][1.7G]
- 张学友1997《不老的传说》宝丽金首版 [WAV+CUE][971M]
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]