Flask-2、部分模板语法(循环、宏、继承)


py目录结构:

|-- static
		|-- css
			|-- style.css
		|-- js
		|--img
			|-- 图片15.jfif
|-- tempalate
		|-- base.html
		|-- xx.html
|-- app.py
一、基础模板语法:

我们已经知道了什么是视图函数,那么在html文件中怎么获取视图函数中传递的变量名进行展示到页面上呢

1、引用视图函数中传递的值

引用变脸值在html中的格式是:{{ 变量名 }}

例如:

# app.py文件:
from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def show():
	name = "ABC"
	name_list = ["林允儿", "宋亚轩", "成吉思汗", "迪丽热巴·迪力木拉提"]
	name_dict = {"name": "A", "name1": "B", "name2": "C"}
	age = 18
	return render_template("test.html", name=name, age=age)
<!-- test.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>展示传入变量的值</title>

</head>
<body>
	用户名是:{{ name }} ---年龄: {{ age }}
	<!-- 这里的{{ name }} 和{{ age }} 是py文件中render_template()传递进来的值,双大括号表示引用变量-->
	
<hr> 
<!-- 引用列表值,并进行展示-->
{{ name_list }}---->>
    {{name_list.0}}、
    {{name_list.1}}、
    {{name_list.2}}、
    {{name_list[3]}}
<hr>

<!-- 引用传递进来的字典中的key,并进行展示-->
{{name_dict}} ---->
    {{name_dict.get("name")}}、 {{ name_dict.name1}}

<!-- 也可以引用对象, 比如这里的people是函数或类的对象people = People()-->
{{ people }} ---> {{ people.age }}
</body>
</html>
2、循环变量:
<!--
这里的name_list 是py文件中的值传递进来的
name_list = [xx,xx,xx,xx,xx]
-->

<ul>
	<!-- for循环语句,格式是{% for xx %} -->
    {% for name in name_list %}   
    		
    	{% if name|length > 2 %}  
        <!-- | 为过滤条件 --> 
        	<li id="n1" style='color:red; font-weight: bold'>{{ name }}  --->> 判断条件为名字大于2就显示红色并加粗</li>
         
        {% else %} 
         <!-- 如果是if条件,最后必须要有else,否则就会报错 -->  
            <li>{{ name }}</li>
             
        {% endif %}  
      	<!-- if条件必须有endif,否则会报错 -->
      	
     {% endfor %}   
     <!-- 如果for循环没有结尾,只会循环一次 -->    
 </ul>
3、loop语法:
loop.index      : 取索引值,从1开始
loop.index0     :去索引值,从0开始
loop.reverse    :反转序号
loop.nextitem   :下一个值
loop.first      :是否是第一个值,返回的值是布尔值(True/False)
loop.revindex   :序号是倒着的
4、常见的过滤器
 msg = "<h1>ni hao</h1>"
 {{ msg | safe}}:某个变量中含有标签元素,又不想转义,就用safe
 1、safe        :不转义
 2、capitalize  : 首字母大写
 3、lower/upper :大小写
 4、reverse     :反转
 5、format
5、自定义过滤器(两种方式)
1、自定义函数(方式一)
	def replace_upper(value): # 大写
		value_ = value.replace(str(value), str(value.upper()))
		return value_
		
	app.add_template_filter(replace_upper, 'upper_test')
	# app.add_template_filter(函数名, 外界的调用名)

2、使用装饰器(方式二)
	@app.template_filter('listreverse') # 反转
	def reverse_list(li):
		tmp_li = list(li)
		tmp_li.reverse()
		return tmp_li

*调用自定义的装饰器
	@app.route('/')
	def test_filter():
		a = [1, 2, 3, 4, 5, 6]
		A = 'hello'
		return render_template('filter01.html', msg=a, repl=A)
		
	`html` 
	{{ msg | listreverse }}
	<hr>
	{{ repl | upper_test }}
二、Jiaja2语法

  Flask 考虑到模板代码的重用性,Jiaja2提供了 (Block)和 (Macro)来提高代码的继承和复用性。
  其中块 (Block)的使用可以极大精简代码,可以通过继承(extend)扩展让大量代码重复使用,并在Block自由定制替换内容块;而宏 (Macro) 的使用更可以极大的提高模板的复用性,减少复杂度,类似于函数,可以传入参数

1、模板继承

  模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。

1、定义父模板
2、子模板继承父模板
步骤:
  父模板:
  1、定义一个基类的html
  2、分析模板中哪些是变化的,对变化的部分用block进行’预留位置’也称作’挖坑’
  3、样式和脚本 需要提前预留
    {% block mycss %} 内容 {% endblock %}
    {% block myjs %} 内容 {% endblock %}


  子使用父模板:

  1、{% extends base.html %} 引入父模板(继承)
  2、找到对应的block,进行填充,每个blcok都是有名字的


2、include 包含

  ”include”是直接将目标模板渲染出来。它同block块继承也不一样,它一次渲染整个模板文件内容,不分块,

例如:基础文件有body标签,子继承后本文件也有body,那么在源码中就会出现两个body标签

当不是所有页面都有,只有部分页面需要公共部分时,可以使用include

先定义一个公共的模板部分,xx.html

谁使用谁用include {% include xx.html ignore missing %}
3、宏的定义 macro

  类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。

无参数

	{% macro input() %}
		<input type="text" name='username' placeholder='用户名'>
	{% endmacro %}

	<!-- 使用, 相当于调用一个函数一样 -->
	{{ input() }}

有参数(可以有默认参数和必须参数)

{% macro form(action, value='登录',method='post') %}  
{# form为宏的名称 ,括号里面为参数#}
	<form action="{{ action }}" method="{{ method }}">
		<input type="text" placeholder="用户名" name="username">
		<hr>
		<input type="password" placeholder="密码" name="password">
		<br>
		<input type="submit" value="{{ value }}">
	</form>
{% endmacro %}

{#调用宏,"/"表示点击提交之后向哪个路由去走 #}
{{ form("/") }}

其它页面使用方式( import … as xx )

	{% import macro.html as f %} # 引入文件
	{{ f.form('/xxxx', value='注册') }}
	# {{ f.宏名称( 参数值 )}}
宏(Macro)、继承(Block)、包含(include)的总结:
  • 宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。
  • 继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。
  • 宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。
  • 包含(include)是直接将目标模板文件整个渲染出来。
4、html文件引用static目录下的文件内容
<link rel="stylesheet" href={{ url_for('static', filename='css/style.css') }}>
	<!-- 必须要写filename,否则会报错 -->
	
<img src={{ url_for('static', filename='img/图片15.jfif') }} alt="">
Flask源码
def __init__(
        self,
        import_name: str,
        static_url_path: t.Optional[str] = None,
        static_folder: t.Optional[str] = "static",  # 默认指向目录中的 static 文件
        static_host: t.Optional[str] = None,
        host_matching: bool = False,
        subdomain_matching: bool = False,
        template_folder: t.Optional[str] = "templates",  # 默认指向目录中的 template s文件
        instance_path: t.Optional[str] = None,
        instance_relative_config: bool = False,
        root_path: t.Optional[str] = None,
        
static_folder、template_folder,已经默认选择了文件夹,所以可以直接找的到
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值