Flask框架
- 模板加载
在视图函数中通过 render_template(“模板地址”,“关键字参数”),加载模板,参数通过关键字传递
from flask import Flask,render_template
app = Flask(__name__)
@app.route("/register/")
def register_view():
return render_template("register.html")
- 模板标签:在python的web框架中,前端要渲染后端数据所要用到的特殊HTML标签
-
if标签
{% if 判断条件1 %}{% elif 判断条件2 %}
…
{% else %}{% endif %}
-
for标签
{% for 循环变量 in 将要遍历的变量 %}
循环体
{% endfor %}
# 示例
from flask import Flask.render_template
app = Flask(__name__)
@app.route("/fruits/")
def fruits_view():
fruits = {"橘子","西瓜","香蕉","苹果","菠萝"}
return render_template("fruits.html",fruits=fruits)
后端传给前端的变量就是模板变量,在模板中借助模板标签进行数据渲染。
{% %}: 一般是判断、遍历、导入、加载使用
{{ }}:一般是展示数据使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Fruits</title>
</head>
<body>
{% if fruits %}
<ul>
{% for fruit in fruits %}
<li>{{ fruit }}</li>
{% endfor %}
</ul>
{% endif %}
</body>
</html>
- 模板继承:当多个模板中的部分标签相同时,我们可以把这部分标签抽出来,放在一个模板中,其余的模板继承自该模板,这个模板就是基类模板或者父模板。
在父模板中使用- {% block 块标签名称 %}
- {% endblock %} “挖坑”;
在子模板中通过{% extends ‘父模板的位置’ %}继承父模板,并通过块模板标签“填坑”。
如果在子模板中需要继承父模板块标签中的内容,则使用{{ super() }}
父模板:在需要更改的地方使用block标签"挖坑",在子模板继承后,需要修改的地方"填坑"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="">
{% block link %}{% endblock %}
</head>
<body>
{% block headers %}
<div class="headers" style="color: blue">这是父模板中的headers</div>
{% endblock %}
{% block mian %}
<div class="main">
{% block contain %}
<div class="main-contain"></div>
{% endblock %}
{% block side %}
<div class="main-side"></div>
{% endblock %}
</div>
{% endblock %}
<div class="footer"></div>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
{% block script %}{% endblock %}
</body>
</html>
子模板:需要修改的可以在子模板中使用block标签选中更改,不需要修改的不写,既需要继承又需要修改的使用 {{ super() }}
{% extends 'base.html' %}
{% block title %}
主页
{% endblock %}
{% block link %}
<link rel="stylesheet" href="">
{% endblock %}
{% block headers %}
{{ super() }}
<div>
<p style="color:crimson">这是子模板中的p标签</p>
</div>
{% endblock %}
{% block side %}
<div class="main-side">
<div>
...
</div>
</div>
{% endblock %}
@app.route("/p/")
def base_view():
return render_template("index.html")
- 模板包含:有时候,有一部分模板在很多模板中都会使用到,这时候,我们可以把这部分标签抽出来,单独写一个模板页面,模板中只写入这部分html代码,在需要的模板中直接拿过来用即可,在子模板中需要的地方使用{% include “需要的标签模板路径” %}接入。
需要使用到的部分html标签
友情链接:
<a href="https://www.baidu.com">百度</a>
<a href="https://www.sohu.com">搜狐</a>
<a href="https://www.360.com">360</a><br/>
联系电话:151xxxxx
要使用部分标签的模板
{% extends 'base.html' %}
{% block title %}
主页
{% endblock %}
{% block link %}
<link rel="stylesheet" href="">
{% endblock %}
{% block headers %}
{{ super() }}
<div>
<p style="color: crimson">这是子模板中的p标签</p>
</div>
{% endblock %}
{% block side %}
<div class="main-side">
<div>
...
</div>
</div>
{% endblock %}
{% block footer %}
{% include 'foot_link.html' %}
{% endblock %}
-
宏(macro):将模板中的常用处理逻辑封装起来,方便模板重复调用,很少用到,这里就不在赘述了。
-
模板过滤器:模板过滤器就是对模板变量,在模板展示渲染的数据进行过滤处理。
在模板变量显示之前通过模板过滤器对显示内容做最后处理
常用过滤器:- upper: 全部大写
- lower: 全部小写
- title: 对每个单词的首字母大写
- capitalize: 对首字母大写
- reverse: 字符串倒序
- sum : 数字列表求和
- safe: 不对特殊字符转义
- replace:替换
- sort:排序
- length:长度
@app.route("/tag/")
def tag_view():
data = {
"A":"hello",
"B":"WORLD",
"C":[1,2,3,4,5],
"D":"Today is nice day.",
"date":"2019,10,24",
"html":"<em>hello</em>"
}
return render_template("index.html",{"data":data})
模板中使用过滤器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Fruits</title>
</head>
<body>
<ul>
<li>{{ data.A|lower }}</li>
<li>{{ data.B|upper }}</li>
<li>{{ data.C|sum }}</li>
<li>{{ data.D|title }}</li>
<li>{{ data.D|capitalize }}</li>
<li>{{ data.D|reverse }}</li>
<li>{{ data.date|replace(",","-") }}</li>
<li>{{ data.html|safe }}</li>
<li>{{ "haskhflhaljla"|length }}</li>
<!-- 正序 -->
<li>{{ [12,54,31,45,2,4,3,99]|sort }}</li>
<!-- 倒序 -->
<li>{{ [12,54,31,45,2,4,3,99]|sort(reverse=True) }}</li>
</ul>
</body>
</html>
- 自定义模板过滤器:
# 方法一
def customer_filter(value):
data = {
0:"女",
1:"男"
}
return data[value]
# 注册自动义过滤器
app.add_template_filter(customer_filter,"check_sex")
#方法二
@app.template_filter("chenk_sex") # 装饰器加入自定义过滤器
def customer_filter(value):
data = {
0:"女",
1:"男"
}
return data[value]
# 方法三
custom = app.jinja_env
custom.filters["check_sex"] = customer_filter # 注册自定义过滤器
# 视图函数
@app.route("/filter/")
def filter_view():
data = {
"name":"Tom",
"sex":1,
"score":90
}
return render_template("filter.html",data=data)
在模板中展示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>customer filter</title>
<style>
table tr td{
width: 100px;
}
</style>
</head>
<body>
<table border="1px" cellspacing="0">
<tr>
<td>{{ data.name }}</td>
<!-- 使用自定义的过滤器 -->
<td>{{ data.sex|check_sex }}</td>
<td>{{ data.score }}</td>
</tr>
</table>
</body>
</html>
- 静态资源的加载: {{ url_for(‘static’,filename=“文件的路径”) }}
在文件夹中保存好要加载的静态文件
@app.route("/static/")
def static_view():
return render_template("static.html")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>static load</title>
</head>
<body>
<img src="{{ url_for('static',filename='img/a.jpg') }}" alt="">
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script src="{{ url_for('static',filename='js/static.js') }}"></script>
</body>
</html>
- 给前端返回json数据:使用jsonify()
将字典包装(将字典、列表、元祖传入jsonify()中),返回给客户端,客户端以json格式接收
@app.route("/json/")
def json_view():
data = {
"name":"Tom",
"age":20,
"sex":"男",
"work":"coder"
}
return jsonify(data)
待更新!!!