1、模板
模板继承和导入与django中的一模一样
from flask import Markup
# @app.template_global() # 如果这里指定了这个装饰器,那么后面context字典里不用传,模板中也能拿到func函数
def func(arg):
return arg+1
@app.template_fileter()
def db(a, b, c):
return a+b+c
@app.route('/tpl/')
def tpl():
context = {
'users': ['shj', 'cr', 'lwb'],
'txt': Markup('<input type="text" />'), # 除了前端用管道safe,也可以使用这个Markup()
'func': func
}
return render_template('tpl.html', **context)
tpl.html:模板渲染
<!--按索引渲染-->
{{ users.0 }} 或者 {{ users[0] }}
<!--渲染txt,需要以管道safe标记为合法-->
{{ txt|safe }}
<!--渲染函数-->
{{ func(6) }}
<!--渲染template_fileter-->
{{ 1|db(2, 3) }}
模板的宏定义
<!--相当于定义了一个函数,没有执行,因此页面不会显示-->
{% macro input(name, type='text', value='') %}
<h1>宏</h1>
<input type="{{type}}" name="{{name}}" value="{{value}}">
<input type="submit" value="提交">
{% endmacro %}
<!--调用定义的函数:如果多处使用,可以这么来做-->
{{ input('n1', 'password') }}
2、session:视图函数中操作时实质就是字典
当请求刚进来时,flask会帮我们读取cookie中某个key对应的值,将这个值解密并反序列化成为一个字典,放入内存,以便视图函数使用。
当请求结束时,flask会读取内存中字典的值,进行序列化和加密,再写入到用户的cookie中
# 设置值
session['key']=value
# 取值
session.get('hey')
# session的配置文件
"SESSION_COOKIE_NAME": "session",
"SESSION_COOKIE_DOMAIN": None,
"SESSION_COOKIE_PATH": None,
"SESSION_COOKIE_HTTPONLY": True,
"SESSION_COOKIE_SECURE": False,
"SESSION_COOKIE_SAMESITE": None,
"SESSION_REFRESH_EACH_REQUEST": True, # 每次请求后,过期时间都刷新
PERMANENT_SESSION_LIFETIME=timedelta(days=1) #设置session的过期时间
3、闪现flash
闪现其实就是在session中存入一个数据,读取时通过pop将数据移除。
如果没有flash,我们自己用session.pop()也可以实现
from flask import flash, get_flashed_messages
@app.route('/page1')
def page1():
flash('临时数据存储', 'error') # 临时放一次
flash('asdfgh', 'error') # 第二个参数是分类
flash('qwerty', 'info')
return 'session'
@app.route('/page2')
def page2():
print(get_flashed_messages(category_filter=['error']))
# 取一次就没有了,第二个参数是分类过滤,根据这个拿到自己想要的数据
return 'session'
4、中间件
call方法什么时候出发?
当用户发起请求时,才执行。
如何在执行call之前,执行一个操作,在call方法执行之后,执行一个操作
方式一: 改源码,但这种不好,在别人的环境也要改
def __call__(self,environ,start_response):
print('执行call之前')
res = self.wsgi_app(environ,start_response)
print('执行call之后')
return res
方式二
class Middleware(object):
def __init__(self, old):
self.old = old
def __call__(self, *args, **kwargs):
print('前')
res = self.old(*args, **kwargs)
print('后')
return res
if __name__ == '__main__':
app.__call__ == Middleware(app.__call__)
5、特殊装饰器:前俩类似django中间件
@app.before_request # 在请求执行前执行
@app.after_request # 在所有请求执行完之后执行,这个装饰的函数必须接收一个response参数,并且需要返回出去
# before_request装饰的函数,谁先定义谁先执行
# after_request装饰的函数,谁后定义谁先执行
# 如果在before_request中有返回值,那么后面的before_request请求装饰的函数不会再执行,直接到最后一个after_request装饰的函数执行;这点要区别于django1.10版本以后的中间件执行流程。
@app.before_first_request # 它装饰的函数在你启动后第一次请求才执行
@app.template_global
@app.template_filter
@app.errorhandler(404) # 没找到页面时可以返回一个404页面
def not_found(arg):
print(arg)
return '没找到'