模板-flash-session-中间件-特殊装饰器

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 '没找到'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值