1、如何渲染模板

  • 模板在‘templates’文件夹下(htnl页面)
  • 从flask中导入render_template函数---渲染html模板
  • 在视图函数中,使用render_template 函数渲染模板。注意:只需要填写模板的名字,不需要填写templates这个文件夹的路径,若在templates下面建立文件夹,则需要填写路径名称。
@app.route('/')
def index():
return render_template('index.html')

2、模板传参

(1)如果只有一个或者少量参数,直接在render_template函数中添加关键字参数就可以了。

(2)如果有多个参数的时候,那么可以先把所有的参数放在字典中,然后在render_template中, 使用两个星号,把字典转换成关键参数传递进去,这样的代码更方便管理和使用。

(1)变量语法

在HTML文件中

{{ params }}

(2)较少的参数(直接传参数)

<p>你好:{{ username }}</p>
selfprojectName.py中:
@app.route('/')
def index():
return render_template('index.html',username='你好') # 模板文件中只有一个变量,直接把参数传进去

(3)很多的参数(特殊的方法传参)

(1)如果只有一个或者少量参数,直接在render_template函数中添加关键字参数就可以了。

(2)如果有多个参数的时候,那么可以先把所有的参数放在字典中,然后在render_template中,使用两个星号,把字典转换成关键参数传递进去,这样的代码更方便管理和使用。

index.html中:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<p>这是一个模板文件</p>
<p>用户名:{{ username }}</p>
<p>年龄:{{ age }}</p>
<p>性别:{{ gender }}</p>
</body>
</html>
selfprojectName.py中:
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
context = {
'username' : '站长',
'age' : '',
'gender' : '男'
}
return render_template('index.html' , **context) # 定义一个字典,双星号把字典转换成关键参数传递进去 if __name__ == '__main__':
app.run(debug=True)

(4)模板中访问模型(类)中的属性和访问字典中的元素

访问模型中的属性或者是字典,可以通过{{params.property}}的形式,或者是使用{{params['age']}}

index.html中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<p>这是一个模板文件</p>
<p>用户名:{{ username }}</p>
<p>年龄:{{ age }}</p>
<p>性别:{{ gender }}</p>
<hr>
<p>访问模型(类)</p>
<p>用户名:{{ person['name'] }}</p>
<p>年龄:{{ person.age }}</p> <hr>
<p>访问字典</p>
<p>百度:{{ websites.baidu }}</p>
<p>谷歌:{{ websites.google }}</p>
</body>
</html>
selfprojectName.py中:
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
# 定义一个类
class Person(object):
name = '老头'
age = p = Person() # 实例化对象 context = {
'username' : '站长',
'age' : '',
'gender' : '男',
'person' : p, # 把模型对象作为参数传进去
# 将一个字典嵌套传参数进去
'websites' : {
'baidu' : 'www.baidu.com',
'google' : 'www.google.com'
}
}
return render_template('index.html' , **context) # 定义一个字典,双星号把字典转换成关键参数传递进去 if __name__ == '__main__':
app.run(debug=True)

3、过滤器

过滤器简单理解:

例如:过滤器的作用就是,如果有头像就显示头像,没有头像就显示默认的头像(无头像)

过滤器的作用对象是变量

(1)语法

{{ avatar|default('xxx') }}

(2)default过滤器

实例一(没有过滤器):

selfprojectName.py中:
#encoding: utf-
from flask import Flask,render_template app = Flask(__name__) @app.route('/')
def index():
return render_template('index.html', avatar='http://avatar.csdn.net/9/0/4/3_ly123963.jpg') if __name__ == '__main__':
app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<p>过滤器模板文件</p> <img src="{{ avatar }}">
</body>
</html>

实例二(加上过滤器):

selfprojectName.py中:
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
return render_template('index.html') # 后端不上传图片,前端将加载默认的图片 if __name__ == '__main__':
app.run(debug=True)

前端加上过滤器之后。 
index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<p>过滤器模板文件</p> <img src="{{ avatar | default('http://noavatar.csdn.net/B/3/F/3_lighting_miaoxingren.jpg') }}">
</body>
</html>

(3)length过滤器

 length过滤器主要用于求列表或者字符串或者字典或者元组的长度。比如统计一篇文章评论的总数,一般都是使用过滤器完成的。 
实例: 
selfprojectName.py中:
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
# 定义一个评论列表
comments = [
{
'user' : '站长',
'content' : u'xxxxxxxxxxxx'
},
{
'user' : '你猜',
'content' : u'yxyxyxyxyxy'
},
{
'user' : '船长杰克',
'content' : u'tttttttmtmtmtmtd'
}
]
return render_template('index.html',comments=comments) if __name__ == '__main__':
app.run(debug=True)

index.html中

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<p>过滤器模板文件</p>
<hr>
<p>评论数:({{ comments|length }})</p>
<ul>
{% for comment in comments %}
<li>
<a href="#">{{ comment.user }}</a>
<p href="#">{{ comment.content }}</p>
</li>
{% endfor %}
</ul>
</body>
</html>

(4)一些常用的过滤器


  • abs(value):返回一个数值的绝对值。示例:-1|abs
  • default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。示例:name|default(‘xiaotuo’)——如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。
  • escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。显例:content|escape或content|e。
  • first(value):返回一个序列的第一个元素。示例:names|first
  • format(value,*arags,**kwargs):格式化字符串。比如:{{ "%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo!
  • last(value):返回一个序列的最后一个元素。示例:names|last。
  • length(value):返回一个序列或者字典的长度。示例:names|length。
  • join(value,d=u”):将一个序列用d这个参数的值拼接成字符串。
  • safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。
  • int(value):将值转换为int类型。
  • float(value):将值转换为float类型。
  • lower(value):将字符串转换为小写。
  • upper(value):将字符串转换为小写。
  • replace(value,old,new): 替换将old替换为new的字符串。
  • truncate(value,length=255,killwords=False):截取length长度的字符串。
  • striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
  • trim:截取字符串前面和后面的空白字符。
  • string(value):将变量转换成字符串。
  • wordcount(s):计算一个长字符串中单词的个数。

4、if判断

(1)语法

{% if xxx %}

{% else %}

{% endif %}

5、for循环遍历字典

1. 字典的遍历

selfprojectName.py中:
@app.route('/')
def index():
# 定义一个字典
user = {
'username' : u'站长',
'age' : 22
}
return render_template('index.html',user=user)

index.html中

{% for k,v in user.items() %}
<p>{{ k }}:{{ v }}</p>
{% endfor %}

语法和python一样,可以使用items()keys()values()iteritems()iterkeys()itervalues()

2.列表的遍历

selfprojectName.py中:
# for遍历列表
@app.route('/')
def index():
websites = ['www.baidu.com','www.google.com'] # 定义一个列表
return render_template('index.html',websites=websites)

index.html中

{% for website in websites %}
<p>{{ website }}</p>
{% endfor %}

6、继承和block

(1)作用:可以把一些公共的代码放在父模板中,避免写重复的代码

1.语法

父模板:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
{% block head %}{% endblock %}
</head>
<div>
<h1>其他照旧</h1>
</div> {% block MainContainer %}{% endblock %}
<body>
</body>
</html>

子模板:

{% extends 'base.html %}

{% block title %}
名字
{% endblock %} {% block head %}
<style>
不同的风格文件
</style>
<link rel="stylesheet" href="">
<script>不同的脚本文件</script>
{% endblock %} {% block MainContainer %}
<h1>这里是写具体内容的地方</h1>
{% endblock %}
selfprojectName.py中:
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
return render_template('index.html') @app.route('/login')
def login():
return render_template('login.html') if __name__ == '__main__':
app.run(debug=True)

base.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.nav-header {
background: #3a3a3a;
height: 65px;
}
ul{
overflow: hidden;
}
ul li{
float: left;
list-style: none;
padding: 0 10px;
line-height: 65px;
}
ul li a{
color: #ffffff;
}
</style>
</head>
<body>
<div class="nav-header">
<ul>
<li><a href="#">首页</a></li>
<li><a href="#">论坛</a> </li>
</ul>
</div> {% block MainContainer %}{% endblock %}
</body>
</html>

index.html 中

使用这个模板之后,所有的代码必须写到block里面去!

{% extends 'base.html' %}

{% block MainContainer %}
<p>这里是首页</p>
{% endblock %}

login.html中

{% extends 'base.html' %}

{% block MainContainer %}
<p>这里是注册页面</p>
{% endblock %}

五、URL链接和加载静态文件

通用语法:

url_for('static',filename='路径')

1.url跳转

 视图函数中:
@app.route('/login/)
def login_function():
return render_template('login.html')

方法一: 
html文件里面

<a href="/login/">点击我</a>

方法二(推荐):

html文件里面

<a href="{{ url_for('login_function') }}">点击我</a>

2.加载静态文件

方法一:

html文件里面

<link rel="stylesheet" href="static/css/index.css">

方法二(推荐):

html文件里面

<link rel="stylesheet" href="{{ url_for('static',filename=''css/index.css) }}">

加载图片方法(推荐):

html文件里面:

<img src="{{ url_for('static',filename='images/logo.png') }}">

加载Js文件方法(推荐):

html文件里面:

<script src="{{ url_for('static',filename='js/index.js') }}">

flask系列三之Jinja2模板的更多相关文章

  1. flask框架下的jinja2模板引擎(2)(过滤器与自定义过滤器)

    flask框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html 这篇论文主要用来记录下 jinja2 的过滤器. 什么是过 ...

  2. flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)

    flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...

  3. Flask(8)- jinja2 模板入门

    前言 之前的文章有个栗子,视图函数可以直接返回一段 html 代码,浏览器可以自动渲染 但是当你的 HTML 非常复杂的话,也要整串写在代码里面吗,这显然不合理的,可阅读性也非常差 所以,就诞生了 J ...

  4. flask框架下的jinja2模板引擎(1)(模板渲染)

    #转载请留言联系 模板是什么? 在 flask 框架中,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.模板作用即是承担视图函 ...

  5. flask传参到jinja2模板出现&#39;导致不可用

    http://blog.csdn.net/wangqing008/article/details/48437793 经常会有字符 空格 ' "" 等被转义成其他字符,这其实是特殊字 ...

  6. Flask框架 请求与响应 & 模板语法

    目录 Flask框架 请求与响应 & 模板语法 简单了解Flask框架 Flask 框架 与 Django 框架对比 简单使用Flask提供服务 Flask 中的 Response(响应) F ...

  7. 测开之路一百二十九:jinja2模板语法

    flask用的是jinja2模板,有自己特定的语法 形参: 在html里面留占位参数: {{ 参数名 }},后端传值时,参数名=参数值 <!DOCTYPE html><html la ...

  8. Python框架学习之Flask中的Jinja2模板

    前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...

  9. 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范

    一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...

随机推荐

  1. Ceph Monitor的数据管理

    转自:https://www.ustack.com/blog/ceph-monitor-2/ Monitor管理了Ceph的状态信息,维护着Ceph中各个成员的关系,这些信息都是存放在leveldb中 ...

  2. 【scala】集和映射

    Scala同时提供了集(Set)和映射(Map)的可变和不可变的不同选择,但使用同样的简单名字,可以通过类继承的关系来区分可变和不可变版本. 如图所示,左边的为不可变集,右边的为可变集. //我们创建 ...

  3. Project Euler 126 - Cuboid layers

    这题先是推公式… 狂用不完全归纳+二次回归,最后推出这么一个奇怪的公式 \[f(t,x,y,z)=4(t-1)(x+y+z+t-2)+2(xy+yz+xz)\] 表示长宽高为\(x\).\(y\).\ ...

  4. hdu4715

    题解: 二分图判断 建立原图的补图 判断是否是二分图 代码: #include<cstdio> #include<cmath> #include<cstring> ...

  5. mysql的5.6版本支持分区吗?

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/72291698 本文出自[我是干勾鱼的博客] 我们知道,查看mysql是否支持分区 ...

  6. 深入Guerrilla Games解密次世代开山大作《杀戮地带暗影坠落》(The technology of Killzone Shadow Fall)

    文章摘要:这几天终于有时间,把全文翻译完了,自己感觉不是太满意,不过大家能看懂就好,就当一个学习的机会.整篇文章通过SONY第一方游戏工作室Guerrilla Games主创的语录,为我们展现了次世代 ...

  7. 人生苦短之我用Python篇(线程/进程、threading模块:全局解释器锁gil/信号量/Event、)

    线程: 有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.是一串指令的集合.线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是 ...

  8. HDU - 5289:Assignment(单调队列||二分+RMQ||二分+线段树)

    Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this com ...

  9. HihoCoder1622 : 有趣的子区间(预处理+组合数)

    有趣的子区间 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个区间[a, b]内恰好包含偶数个回文整数,我们就称[a, b]是有趣的区间. 例如[9, 12]包含 ...

  10. bzoj 4565 字符合并

    Written with StackEdit. Description 有一个长度为 \(n\) 的 \(01\) 串,你可以每次将相邻的 \(k\) 个字符合并,得到一个新的字符并获得一定分数.得到 ...