一、自定义过滤器
过滤器的本质是函数
1、通过flask模块中的add_template_filter方法
a、定义函数,带有参数和返回值
b、添加过滤器 add_template_filter(function,name=’’)
c、在模板中使用:{{ 变量|自定义过滤器 }}
2、使用装饰器完成
a、定义函数,带有参数和返回值
b、通过装饰器完成, @app.template_filter(‘过滤器名字’)装饰步骤一的函数
c、在模板中使用:{{ 变量|自定义过滤器 }}
@app.route('/')
def hello_world():
msg = ' hello everyone hello world '
li =[3,5,8,9,6]
return render_template('define_filtu.html', msg=msg, li=li)
# 第一种方式
def replace_hello(value):
print('---------->', value)
value = value.replace('hello', '')
print('==========>', value)
return value.strip()
# 第二种方式 装饰器
@app.template_filter('reverse')
def reverse_list(li):
temp_li = list(li)
temp_li.reverse()
return temp_li
二、模板的复用
1、模板继承
2、include
3、宏
模板:
如果想在视图函数中获取模板xxx.html的内容则通过render_template()
render_template(“模板名称”)返回值是一个字符串
主要是通过模板引擎将模板内容转成字符串的形式
@app.route('/index')
def index():
return render_template('index.html')
模板继承:
需要模板继承的情况:
1、多个模板具有完全相同的顶部和底部
2、多个模板具有的模板内容,但是内容中部分不一样
3、多个模板具有完全相同的模板内容
{{ extends " 模板名字"}}
{{ endextends }}
{% block 名字 %}
(与模板页面不同的地方)
{% endblock %}
"""
{{extends}}{{ endextends }}父模板页面的继承
{{% block 名字 %}}{{% endblock %}}在HTML中页面之间有相同的地方也有不同的地方
比如一个网站中页面的头往往是相同的而中间的内容是不同的所以要进行页面编写要用到block
在父模板中保留要更改的地方,例如CSS,JS在不同的页面要进行改写所以要在父模板中留空。
"""
三、蓝图
蓝图(blueprint)是一种组织一组相关视图及其代码的方式。随着项目的扩大将所有的路由以及数据库连接内容写在app.py显然不现实以及不便于日后的维护。蓝图就是将要写在一块的代码分开写。在蓝图被注册到应用之后,所要执行的操作的集合。当分配请求 时, Flask 会把蓝图和视图函数关联起来,并生成两个端点之前的 URL 。
为什么要使用蓝图:
1)把一个应用分解为一套蓝图。这是针对大型应用的理想方案:一个项目可以实例化 一个应用,初始化多个扩展,并注册许多蓝图。
2)在一个应用的 URL 前缀和(或)子域上注册一个蓝图。 URL 前缀和(或)子域的 参数成为蓝图中所 有视图的通用视图参数(缺省情况下)。
3)使用不同的 URL 规则在应用中多次注册蓝图。
4)通过蓝图提供模板过滤器、静态文件、模板和其他工具。蓝图不必执行应用或视图 函数。
5)当初始化一个 Flask 扩展时,为以上任意一种用途注册一个蓝图。
创建蓝图
1)在项目中创建一个apps包,包括页面逻辑以及数据库中的内容最后都会在这个apps包中完成。
2)在apps包中的__init__.py中进行蓝图的注册以及配置
#__init__.py
from flask import Flask
def create_app():
app = Flask(__name__, template_folder='../templates', static_folder='../static') # app是一个核心对象
# template_folder='../templates', static_folder='../static'改变Flask寻找模板的路径
app.config.from_object(settings.DevelopmentConfig) # 导入配置文件
# 蓝图
app.register_blueprint(user_bp) # 将蓝图对象绑定到app上
app.register_blueprint(order_bp)
return app
#app.py
from apps import create_app
app = create_app()
if __name__ == '__main__':
app.run()
3)新创建关于对象的包例如user包在里面新建view.py(视图函数)、model.py(数据库)
#view.py
from flask import Blueprint, render_template, request, redirect
from apps import user
user_bp = Blueprint('user', __name__)
@user_bp.route('/')
def user_center():
return render_template('user/show.html', users=users)