flask之jinjia2模板(二)
1.1.模板传参
(1)主程序
from flask import Flask,render_template app = Flask(__name__) @app.route('/')
def hello_world(): context = {
'username':'derek',
'age':18,
'gf':{
'name':'xxx',
'height':160
}
}
return render_template('index.html',**context) #加双下划綫,就可以直接获取key和value了 if __name__ == '__main__': app.run(debug=True)
(2)index.html
<h2>模板中渲染数据</h2>
<p>{{ username }}</p>
<p>{{ age }}</p>
<p>{{ gf.name }}</p>
<p>{{ gf['height'] }}</p>
1.2.过滤器
常用的过滤器
- abs:绝对值
- default:如果当前变量没有值,则会使用参数中的值来替代
- escape:转义字符
- first:返回一个序列的第一个元素
- format:格式化字符串
- last:返回一个序列的最后一个元素
- length:返回一个序列的长度
- join:拼接字符串
- safe:关掉转义
- int:转为int类型
- float:转为浮点类型
- lower:转换为小写
- upper:转换为答谢
- replace:替换
- truncate:截取length长度的字符串
- striptags:删除字符串中所有的html标签,如果出现多个空格,将替换成一个空格
default过滤器的使用
主程序
from flask import Flask,render_template
app = Flask(__name__) @app.route('/')
def hello_world(): context = {
'position':-9,
'signature':None #个性签名
}
return render_template('index.html',**context) if __name__ == '__main__':
app.run(debug=True)
index.html
<h2>过滤器</h2>
<p>{{ position|abs }}</p>
<p>个性签名:{{ signature|default('此人很懒,没有留下任何说明',boolean=True) }}</p>
也可以用or的方式
<h2>过滤器</h2>
<p>{{ position|abs }}</p>
{# <p>个性签名:{{ signature|default('此人很懒,没有留下任何说明',boolean=True) }}</p>#}
<p>个性签名:{{ signature or '此人很懒,没有留下任何说明' }}</p>
1.3.自定义过滤器
过滤器本质上就是一个函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器这个函数,
然后函数的返回值会作为这个过滤器的返回值。需要使用一个装饰器:@app.template_filter('args')
实例:自定义时间处理过滤器
主程序
from flask import Flask,render_template
from datetime import datetime
app = Flask(__name__) @app.route('/')
def hello_world():
context = {
'create_time':datetime(2018,5,25,17,52,10)
}
return render_template('index.html',**context) @app.template_filter('handle_time') #括号里面是自己给过滤器起的名字
def handle_time(time):
'''
1.如果时间间隔小与1分钟以内,就显示“刚刚”
2.如果是1小时以内,显示“xx分钟”
3.如果24h以内,显示“xx小时前”
4.如果大于24小时小与30天,显示“xx天前”
5.大于一个月,显示具体的时间
:param time:
:return:
'''
if isinstance(time,datetime):
now = datetime.now()
timestamp = (now-time).total_seconds() #当前时间离创建时间的秒数
if timestamp < 60: #60s以内
return "刚刚"
elif timestamp >= 60 and timestamp < 60*60:
minutes = timestamp / 60
return "%s分钟前"%int(minutes)
elif timestamp >= 60*60 and timestamp < 60*60*24:
hours = timestamp / (60*60)
return '%s小时前'%int(hours)
elif timestamp >= 60*60*24 and timestamp < 60*60*24*30:
days = timestamp / (60*60*24)
return '%s天前'%int(days)
else:
return time.strftime('%Y/%m/%d %H:%M')
else:
return time if __name__ == '__main__':
app.run(debug=True)
index.html
<h2>自定义时间过滤器</h2>
{{ create_time|handle_time }}
1.4.if和for的使用
for中包含以下变量,可以用来获取当前的遍历状态
- loop.index
- loop.index0
- loop.first
- loop.last
- loop.length
if和for简单用法
from flask import Flask,render_template app = Flask(__name__)
app.config.update({
'DEBUG':True,
'TEMPLATES_AUTO_RELOAD':True
}) @app.route('/')
def hello_world():
context = {
'age':20,
'users':['tom','jack','alice'],
'person':{
'name':'derek',
'age':18
}
}
return render_template('index.html',**context) if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> {% if age >= 18 %}
欢迎
{% else %}
无权限
{% endif %} <ul>
{% for user in users %}
<li>{{ user }}</li>
{% endfor %}
</ul> <table>
<thead>
<tr>
<th>用户名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<tr>
{% for key,value in person.items() %}
<td>{{ value }}</td>
{% endfor %}
</tr>
</tbody>
</table> </body>
</html>
1.5.宏的使用和导入
模板的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些
不固定的值抽取出来当成一个变量。
(1)简单使用实例
{# 定义一个宏,input是宏的名字,里面三个参数,可以指定默认参数值,也可以调用的传参#}
{% macro input(name="",value="",type="text") %}
<input name="{{ name }}" value="{{ value }}" type="{{ type }}">
{% endmacro %} <form>
<p>用户名:{{ input('username') }}</p>
<p>密码:{{ input('password',type="password" )}}</p>
<p> {{ input(value="提交",type="submit" )}}</p> </form>
(2)宏的两种导入方式
新建macros.html
{% macro input(name="",value="",type="text") %}
<input name="{{ name }}" value="{{ value }}" type="{{ type }}">
{% endmacro %}
index.html中导入使用宏
{#第一种#}
{# with context可以把后端传到当前模板的变量传到定义的宏里面#}
{% import "macros.html" as macro with context %}
{#第二种#}
{% from "macros.html" import input as input_field %} <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 第一种#}
<form>
<p>用户名:{{ macro.input('username') }}</p>
<p>密码:{{ macro.input('password',type="password" )}}</p>
<p> {{ macro.input(value="提交",type="submit" )}}</p>
</form> {# 第二种#}
<form>
<p>用户名:{{ input_field('username') }}</p>
<p>密码:{{ input_field('password',type="password" )}}</p>
<p> {{ input_field(value="提交",type="submit" )}}</p>
</form> </body>
</html>
1.6.set、with在模板中自定义变量
(1)set
在模板中可以使用set来定义变量,一旦定义了这个变量,在后面的代码中都可以使用,index.html
{% set usernmae='derek' %} <p>用户名:{{ usernmae }}</p>
(2)with
with语句定义的变量,只能在with语句代码块(endwith)里面使用,超过代码块,就不能再使用了,set语句没有end,全局使用
{% with age=18 %}
<p>年龄:{{ age }}</p>
{% endwith %}
1.7.蓝图的使用
目录如下:
(1)news.py
from flask import Blueprint news_bp = Blueprint('new',__name__,url_prefix='/news') @news_bp.route('/list/')
def news_list():
return '新闻列表'
(2)user.py
from flask import Blueprint # 1.定义一个蓝图,'user':蓝图的名字,url_prefix='/user':给url加一个前缀,注意后面不要加'/'
user_bp = Blueprint('user',__name__,url_prefix='/user') @user_bp.route('/profile/')
def profile():
return '个人中心'
(3)bluepoint_demo.py
from flask import Flask,url_for
# 2.导入
from blueprints.user import user_bp
from blueprints.news import news_bp app = Flask(__name__)
# 3.注册蓝图
app.register_blueprint(user_bp)
app.register_blueprint(news_bp) @app.route('/')
def hello_world():
return 'Hello World!' with app.test_request_context():
print(url_for('new.news_list')) # /news/list/ 通过url_for反转url的时候要加蓝图的名字
print(url_for('user.profile')) # /user/profile/ if __name__ == '__main__':
app.run(debug=True)
flask之jinjia2模板(二)的更多相关文章
- flask中jinjia2模板引擎详解4
接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下{% extends & ...
- flask中jinjia2模板引擎使用详解1
在之前的文章中我们介绍过flask调用jinja2模板的基本使用,这次我们来说一下jinjia2模板的使用 Jinja2 在其是一个 Python 2.4 库之前,被设计 为是灵活.快速和安全的. 模 ...
- flask之jinjia2模板语言
flask_jinjia2.py ''' flask中的jinjia2模板语言(和django中模板类似): (1)模板变量{{ }} (2)模板标签{% %} ①for循环遍历 {% for foo ...
- flask中jinjia2模板使用详解2
接上文 注释的使用 在jinjia2模板中,使用{# #}进行代码注释,如下所示 运行后发现,注释不会被render出来 去掉空行 两种方法可以去掉jinjia2模板中的空白行,一是设置jinjia2 ...
- flask中jinjia2模板引擎详解3
接上文 模板继承 Jinji2中的模板继承是jinjia2比较强大的功能之一. 模板继承可以定义一个父级公共的模板,把同一类的模板框架定义出来共享. 这样做一方面可以提取共享代码,减少代码冗余和重复的 ...
- flask之jinjia2模板
一:渲染模板 app.run(debug=True) 开启debug模式,flask框架自动提示错误提示的页面显示. 视图函数 from flask import Flask from flask ...
- flask中jinjia2模板引擎使用详解5
接上文 宏 可以理解为函数,即把一些常用的模板片段做好封装,以便于重用,减少工作量和维护难度. 宏的定义很简单: {%macro xxx()%} ##这里写内容 {%endmacro%} 下面引用 ...
- [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)
oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...
- 7、Flask实战第7天:Jinjia2模板
Jinja2模板介绍和查找路径 在前面的章节中,视图只是直接返回文本,然而在实际生产环境中其实很少这样用,因为实际的页面大多带有样式和复杂逻辑的HTML代码,这可以让浏览器其渲染出非常漂亮的页面. 我 ...
随机推荐
- AJAX四种跨域处理方法
同源策略 同源策略 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 具体定义是:一段脚本向后台请求数据,只能读取属于同一协议名. ...
- SqlServer为字段创建索引
语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名) 创建索引实例: 聚簇索引 create clustered index index_name on table_name (c ...
- 存储过程使用 in 添加多个参数的情况处理方式【转】
原文连接:http://www.jb51.net/article/41472.htm -->情景 ① 通过刚才的SQL递归方式,我们已经可以将一个组织机构和其全部下级单位查询出来:假设每个组织机 ...
- centos7 修改中文字符集
CentOS 7字符集的问题与6有点区别,会出现下面问题,查看是中文,vi进入就变成乱码了 生产中修改配置文件 [root@ce1d2002a999 ~]# cat /etc/locale.con ...
- 2.1Python基础语法(一)之注释与数据类型:
返回总目录 目录: 1.注释 2.乱码 3.变量 4.数据类型 5.数据的转换 6.动态,静态和强类型,弱类型 (一)注释:(编译时是被编译器忽略的) 1.注释的分类: 2.特殊注释: (二)乱码:( ...
- NOIP2018考前抱佛脚——图论基础复习
目录 存图方式 邻接矩阵存图 邻接表存图 链式前向星 最小生成树 例1 P1536 村村通 题目描述 输入输出格式 输入输出样例 标程 例2 P1546 最短网络 Agri-Net 题目背景 题目描述 ...
- SDN第4次上机作业
作业链接 1.建立以下拓扑,并连接上ODL控制器. ODL拓扑界面截图: 安装odl参考链接 2.利用ODL下发流表,使得h3在10s内ping不通h1,10s后恢复. 验证性连通性截图: 将hard ...
- python 下 安装openCV
安装openCV openCV是Intel 创建的计算机视觉库,用于计算机图像处理. 安装anaconda,在命令行中输入conda install cv2/opencv 报错汇总 网络连接问题 报错 ...
- swift protocol的几种形式
三个关注点:1.形式:2.实现方式:3.使用方式: 一.基本形式: 形式:内部无泛型类型: 实现:只需指定类型和实现相应的功能即可: 使用:可以用在其他类型出现的任何地方: protocol Resp ...
- loglevel-metamask
pimterry/loglevel https://github.com/pimterry/loglevel Minimal lightweight simple logging for JavaSc ...