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模板(二)的更多相关文章

  1. flask中jinjia2模板引擎详解4

    接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下{% extends & ...

  2. flask中jinjia2模板引擎使用详解1

    在之前的文章中我们介绍过flask调用jinja2模板的基本使用,这次我们来说一下jinjia2模板的使用 Jinja2 在其是一个 Python 2.4 库之前,被设计 为是灵活.快速和安全的. 模 ...

  3. flask之jinjia2模板语言

    flask_jinjia2.py ''' flask中的jinjia2模板语言(和django中模板类似): (1)模板变量{{ }} (2)模板标签{% %} ①for循环遍历 {% for foo ...

  4. flask中jinjia2模板使用详解2

    接上文 注释的使用 在jinjia2模板中,使用{# #}进行代码注释,如下所示 运行后发现,注释不会被render出来 去掉空行 两种方法可以去掉jinjia2模板中的空白行,一是设置jinjia2 ...

  5. flask中jinjia2模板引擎详解3

    接上文 模板继承 Jinji2中的模板继承是jinjia2比较强大的功能之一. 模板继承可以定义一个父级公共的模板,把同一类的模板框架定义出来共享. 这样做一方面可以提取共享代码,减少代码冗余和重复的 ...

  6. flask之jinjia2模板

    一:渲染模板 app.run(debug=True)  开启debug模式,flask框架自动提示错误提示的页面显示. 视图函数 from flask import Flask from flask ...

  7. flask中jinjia2模板引擎使用详解5

    接上文 宏 可以理解为函数,即把一些常用的模板片段做好封装,以便于重用,减少工作量和维护难度. 宏的定义很简单: {%macro xxx()%} ##这里写内容 {%endmacro%}   下面引用 ...

  8. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  9. 7、Flask实战第7天:Jinjia2模板

    Jinja2模板介绍和查找路径 在前面的章节中,视图只是直接返回文本,然而在实际生产环境中其实很少这样用,因为实际的页面大多带有样式和复杂逻辑的HTML代码,这可以让浏览器其渲染出非常漂亮的页面. 我 ...

随机推荐

  1. 如何加密 Windows VM 上的虚拟磁盘

    为了增强虚拟机 (VM) 的安全性以及符合性,可以加密 Azure 中的虚拟磁盘. 磁盘是使用 Azure 密钥保管库中受保护的加密密钥加密的. 可以控制这些加密密钥,以及审核对它们的使用. 本文详细 ...

  2. 表迁移工具的选型-复制ibd的方法-传输表空间

    1.1. 场景 有的时候开放人员自己的库需要帮忙导一些数据,但是表的数据量又很大.虽然说使用mysqldump或mysqlpump也可以导.但是这耗时需要比较久. 记得之前建议开放人员可以直接使用na ...

  3. Java中字符数组、String类、StringBuffer三者的相互转换

    一.StringBuffer与String的相互转换 1.将StringBuffer转换成String StringBuffer类成员toString函数可将其转换成String类型. StringB ...

  4. 安全之路 —— C/C++开3389端口(远程终端)

    简介 在渗透测试中开启对方电脑的3389端口是入侵者加入对方计算机账户后要想直接控制对方计算机的必须步骤,即开启对方计算机的远程终端功能,不同的Windows系统要开启3389需要修改不同的注册表项, ...

  5. 关于mybatis反向生成为什么有时候实体类会变成两个

    一般来说,将TEXT字段,从一张操作频繁的表中拆分出去,成为一个Key-Value结构的独立表是 好处颇多的. 其有利之处主要体现在下面三个方面: PS:以下的讨论对象均基于Innodb引擎 1. 便 ...

  6. 35_张孝祥Java高新技术_为注解增加各种属性

    注解的作用之所以那么强大,就是因为它有属性 注解很像接口,属性很像方法.   什么是注解的属性 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是.如果还想区分出事传智播客 ...

  7. libcurl.dll 7.60.0静态库包含openssl/zlib

    最近做个QT的小程序需要使用LIBCURL支持HTTPS,结果查资料发现官方默认的是不支持的,需要手动重新编译,编译的时候加入SSL支持. 看着就好麻烦的样子, 找了一圈,还真有现成的,但是现在写程序 ...

  8. 【python27】猜随机数的小游戏

    游戏规则: 猜一个随机数,如果猜对了就给出相应的猜成功提示语(自定义文字),如果猜大或者是猜小了,给出对应的提示,但总的猜次数为三次,每猜错一次重新猜时,给用户提示所剩余的猜次数 实现如下: # -* ...

  9. error occurred at recursive SQL level 1

    ORA-00604: error occurred at recursive SQL level 1出现的错误:java.sql.SQLException: ORA-00604: error occu ...

  10. centos 7 安装jira 破解

    http://blog.csdn.net/itjinglun/article/details/52240479