flask三: 模版
一.html模版示例:
新建html文件:application/templates/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>这是首页</h1> <p>{{ msg }}</p> </body> </html>
在views.py视图函数,return渲染后的模版,使用render_template()渲染
from flask import Blueprint from flask import render_template first_blue = Blueprint('first_blue', __name__) @first_blue.route("/") def index(): # return "这是首页" return render_template('index.html', msg="首页参数")
二.Jinjia2模版
python中的jinjia2中文文档:http://docs.jinkan.org/docs/jinja2/templates.html
flask的jinjia2英文文档:https://jinja.palletsprojects.com/en/master/
1.变量、for和if标签示例:
a.模版T:students.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>StudentsList</title> </head> <body> <ul> {% for student in student_list %} <li>{{ student }}</li> {% endfor %} </ul> <hr> {% if a %} <h1>这是A: {{ a }}</h1> {% endif %} <hr> {% if a == b %} <h1>a:{{ a }}等于b:{{ b }}</h1> {% endif %} </body> </html>
b.视图V:
@first_blue.route('/students/') def students(): student_list = ["名字%d" % i for i in range(10)] return render_template("students.html", student_list=student_list, a=5, b=5)
2.block、extends结构标签:化整为零,拆分
示例:
a.父模版:挖坑---block(声明坑)
templates/user/base_user.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> {% block ext_css %} {% endblock %} </head> <body> <div> {% block header %} {% endblock %} {% block content %} {% endblock %} {% block foot %} {% endblock %} {% block ext_js %} {% endblock %} </div> </body> </html>
b.子模版:继承父模版--extends,填坑--block(填坑)
templates/user/user_register.html
{% extends 'user/base_user.html' %} {% block content %} <h2>这是register的content</h2>{% endblock %}
c.视图:
@first_blue.route('/user-register/') def user_register(): return render_template('user/user_register.html', title="注册页")
二次填坑示例:
孙模版,继承子模版,子模版继承父模版。
默认覆盖它的上级的坑。
a.templates/user/user_register_agin.html 继承自user_register.html
{% extends 'user/base_user.html' %} {% block content %} <h2>二次填坑.....register的content</h2>{% endblock %}
b.视图:
@first_blue.route('/user-register-again/') def user_register_again(): return render_template('user/user_register_again.html', title="注册页222")
注:如果继承后保留上级块中的内容,即不覆盖,使用 {{ supper() }}
{% extends 'user/base_user.html' %}
{% block content %} {{ super() }} <h2> 二次填坑 </h2> {% endblock %}
3.include包含标签:化零为一,包含其它模版
示例:
<div> <h2>这是banner</h2> </div>
b. include,包含banner模版
templates/user/user_register3.html
{% extends 'user/user_register.html' %} {% block content %} {{ super() }} <h5>再次注册</h5> {% include 'banner.html' %} {% endblock %}
4. marco宏标签:在模版中自定义函数,给其它地方调用
示例:templates/macro_test1.html
定义macro、调用macro
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> {% block ext_css %} {% endblock %} </head> <body> <div> {% macro hello() %} <p>这是一个macro</p> {% endmacro %} </div> {{ hello() }} {{ hello() }} {{ hello() }} {{ hello() }} </body> </html>
示例:导入macro
templates/functions/functionSet1.html
{% macro hello() %} <p>这是一个macro</p> {% endmacro %} {% macro sayHi(name) %} <p>hi, {{ name }}</p> {% endmacro %}
在一个html文件中,导入另外一个文件中的macro
{% extends 'user/base_user.html' %} {% block content %} {{ super() }} <br> <p>再次注册</p> {% from 'functions/function_set1.html' import sayHi %} {{ sayHi("Jerry") }} {{ sayHi("Json") }} {% endblock %}
5.for循环标签
示例:
模版:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>StudentsList</title> </head> <body> {% for student in student_list %} {% if loop.first %} <li style="color: red">序号: {{ loop.index }}--index: {{ loop.index0 }}--学生: {{ student }}</li> {% elif loop.last %} <li style="color: blue">序号: {{ loop.index }}--index:{{ loop.index0 }}--学生: {{ student }}</li> {% else %} <li>序号: {{ loop.index }}--index:{{ loop.index0 }}--学生: {{ student }}</li> {% endif %} {% endfor %} </body> </html>
视图:
@first_blue.route('/students/') def students(): student_list = ["名字%d" % i for i in range(10)] return render_template("students.html", student_list=student_list, a=5, b=3)
6.过滤器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>StudentsList</title> </head> <body> 原始值: {{ message }}<br> 首字母大写title: {{ message|title }}<br> 全部大写upper: {{ message|upper }}<br> 全部小写lower: {{ message|lower }}<br> capitalize: {{ message|capitalize }}<br> {{ message|trim }}<br> {{ message|reverse }}<br> {{ message|format }}<br> {{ message|striptags }}<br> </body> </html>
三. flask-bootstrap插件
四.模版路径
模版路径,默认在Flask(app)创建的路径下
自己指定模版路径:
- 在Flask创建app的时候,指定template_folder
- 在蓝图创建的是时候,也可以指定template_folder
在模版中,和python代码一样,可以使用url_for()反向解析
五.静态资源路径
静态资源路径,默认在Flask(app)创建的路径下
自己指定静态资源路径:
- 在Flask创建app的时候,指定static_folder
- 在蓝图创建的是时候,也可以指定static_folder
<link rel="stylesheet" href="/static/css/students.css"> <link rel="stylesheet" href="{{ url_for('static', filename='css/students.css') }}"> <a> href="{{ url_for('apps.get_user_list') }}?page={{ page }}&per_page={{ per_page }}"</a>
posted on 2020-06-18 22:21 myworldworld 阅读(110) 评论(0) 收藏 举报