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)

2.Flask jinjia2模板的更多相关文章

  1. day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-SQLAlchemy的创建模型类和基本的增删改查

    目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在 ...

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

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

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

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

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

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

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

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

  6. flask之jinjia2模板语言

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

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

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

  8. flask框架--模板

    今天又是一个精彩又无聊的一天,不过随着知识的缓慢的增加我的内心也充满了干劲,虽然前进的有些缓慢 但我不会这么容易放弃的,一定要相信自己,不要灰心 好了 ~ 不说废话了 , 我自己听的都有些受不了了 . ...

  9. Flask:Flask的模板系统和静态文件

    1.Flask模板系统 Django框架有自己独立的模板系统,而Flask是没有的,Flask默认采用jinjia2模板系统,jinjia2是仿写Django模板系统的一个第三方模块,但性能上要比Dj ...

随机推荐

  1. scrapy分布式爬虫scrapy_redis一篇

    分布式爬虫原理 首先我们来看一下scrapy的单机架构:     可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页 ...

  2. selenium--unittest 框架/selenium--常见异常

    selenium常见异常 from selenium import webdriver from selenium.webdriver.common.by import By from seleniu ...

  3. yum安装指定版本的软件包的方法

    yum默认都是安装最新版的软件,这样可能会出一些问题,或者我们希望yum安装指定(特定)版本(旧版本)软件包.所以,就顺带分享yum安装指定(特定)版本(旧版本)软件包的方法. 过程如下:假设这里是我 ...

  4. Redis分布式锁的try-with-resources实现

    Redis分布式锁的try-with-resources实现 一.简介 在当今这个时代,单体应用(standalone)已经很少了,java提供的synchronized已经不能满足需求,大家自然 而 ...

  5. .Net core验证码生成

    首先,项目添加对ZKWeb.System.Drawing的引用: 生成验证码代码如下: public class VierificationCodeServices { /// <summary ...

  6. 【BZOJ 2850】巧克力王国

    复习了下KDtree,贴一下新板子233. #include "bits/stdc++.h" using namespace std; inline int read(){ ,k= ...

  7. spot 状压dp

    题目大意:数轴上有n个泥点,共有m个木板,求最少用几个木板可以覆盖全部泥点,并求最优方案数(n,m<=15) 看范围,肯定是状压 f[i][j]表示前i个泥点都被覆盖,使用的木板集合为j 转移: ...

  8. DCGAN 代码简单解读

    之前在DCGAN文章简单解读里说明了DCGAN的原理.本次来实现一个DCGAN,并在数据集上实际测试它的效果.本次的代码来自github开源代码DCGAN-tensorflow,感谢carpedm20 ...

  9. 哎呀,我老大写Bug啦——记一次MessageQueue的优化

    MessageQueue,顾名思义消息队列,在系统开发中也是用的比较多的一个中间件吧.我们这里主要用它来做日志管理和订单管理的,记得老老大(恩,是的,就是老老大,因为他已经跳槽了)还在的时候,当时也是 ...

  10. 一份完整的阿里云 Redis 开发规范,值得收藏!

    来源:yq.aliyun.com/articles/531067 作者:付磊-起扬 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通 ...