Flask-模板请求响应对象的属性和方法以及cookie和session

模板

# 之前学的完全一样,for,if, 
# 模板语言支持函数加括号执行

# 模板有没有处理xss攻击,在页面显示标签,内部怎么实现的?
    -1 模板层   要渲染的字符串|safe
    -2 后端:Markup('<input type="text">')
# Markup等价django的mark_safe ,

# extends,include一模一样

定义全局模板公共方法

注意:在蓝图中注册时候,应用范围只有本蓝图。

mb_test.py

from flask import Flask, render_template


app=Flask(_name_,)

@app.template_global()  # 模板中调用方法:{{ func("赵海宇") }}
def func(arg):
    return'海狗子' + arg

@app.template_filter()  # 模板中调用方法:{{ "赵海宇"|x1() }}
def x1(arg):
    return'海狗子' + arg  

@app.route('/md/hg')
def index():
    return render_template('md_hg.html')

if __name__ == 'main':
    app.run()

md_hg.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<h1>MDHG</h1>
{{ func("赵海宇") }}
{{ "赵海宇"|x1() }}
</body>
</html>

flask特殊装饰器

before_request  请求来的时候先执行before_request装饰的函数,再执行视图,不能有返回值

after_request  请求走的时候执行,需要返回值response

from flask import Flask, render_template

app = Flask(__name__)


@app.before_request
def f1():
    print('f1')


@app.after_request
def f10(response):
    print('f10', '----->', response)
    return response

@app.route('/index')
def index():
    print('index')
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

注意:before和after request可以在蓝图中定义,在蓝图中定义的话,作用域只在本蓝图。

装饰器小细节

from flask import Flask, render_template

app = Flask(__name__)


@app.before_request
def f1():
    print('f1')


@app.after_request
def f10(args):
    print('f10', '----->', args)
    return args


def x1():
    print('x1')


app.before_request(x1)    # before_request或者after_request也可以这样玩


@app.route('/index')
def index():
    print('index')
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

request对象的属性和方法

参考:https://www.cnblogs.com/pure3417/p/14799899.html

# request.method  提交的方法
# request.args  get请求提及的数据,使用:request.args.get('pk')
# request.form   post请求提交的数据,使用:request.form.get('name')
# request.values  post和get提交的数据总和
# request.cookies  客户端所带的cookie

# request.headers  请求头
# request.path     不带域名,请求路径

# # request.full_path  不带域名,带参数的请求路径

# request.url           带域名带参数的请求路径

# request.base_url        带域名请求路径
# request.url_root      域名
# request.host_url        域名
# request.host            127.0.0.1:500
# request.files
# obj = request.files['the_file_name']
# obj.save('/var/www/uploads/' + secure_filename(f.filename))

响应对象方法

# 响应对象
# 响应相关信息
# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html')
# 对着django,JsonResponse
# return jsonify({'k1':'v1'})

aa='hello world'
res=make_response(aa)
res.set_cookie('xxx','lqz')
# 往响应头中放东西
res.headers['X-Something'] = 'A value'
print(type(res))
from  flask.wrappers import Response
return res

# response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response
# return 'hello'

补充:

varchr :65535个字节的数据
 -utf8:中文2个字节,varchar(300-utf8mb4:3个字节,varchar(300# 快速导出requestment.txt
pip3 install pipreqs
# pipreqs ./ --encoding=utf-8

cookie和session

res=make_response('hello world')
res.set_cookie('xxx','lqz')            # 设置cookie
res.delete_cookie('key')            # 删除

# 全局导入
# 视图函数中 session['key']=value
# 删除:session.pop('key')
# 取:session['key']

# open_session
# save_session

注意事项:
# session需要配置secret_key
app.secret_key = 'sdfsdf'

示例:
from flask import Flask,session

app = Flask(__name__)
app.secret_key = 'sdfsdf'


@app.route('/')
def index():
    session['k1'] = 'v1'

if __name__ == '__main__':
    app.run()

 请求扩展

# 请求扩展类似django中的中间件


# 1 请求来了就会触发,类似于django的process_request, 如果有多个,顺序是从上往下
@app.before_request
def before(*args, **kwargs):
    if request.path=='/login':
        return None
    else:
        name=session.get('user')
        if not name:
            return redirect('/login')
        else:
            return None
        
# 2 # 请求走了就会触发,类似于django的process_response,如果有多个,顺序是从下往上执行
@app.after_request
def after(response):
    print('我走了')
    return response

#3 before_first_request 项目启动起来第一次会走,以后都不会走了,也可以配多个(项目启动初始化的一些操作)
@app.before_first_request
def first():
    print('我的第一次')
    
    
# 4 每次视图函数执行完了都会走它,# 用来记录出错日志
@app.teardown_request  # 用来记录出错日志
def ter(e):
    print(e)
    print('我是teardown_request ')

    
# 5 errorhandler绑定错误的状态码,只要码匹配,就走它
@app.errorhandler(404)
def error_404(arg):
    return render_template('error.html',message='404错误')

# 6 全局标签
@app.template_global()
def sb(a1, a2):
    return a1 + a2
# 在模板中:{{ sb(3,4) }}

# 7 全局过滤器
@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3
# 在模板中{{ 1|db(2,3)}}



1 before_request 请求来时执行,和django中间件中的process_request类似
2 after_request,请求走时执行,接收response参数,需要return response

3 注意有多个的情况,执行顺序;before_request 从上往下;after_request从下网上

4 before_request请求拦截后,也就是有return值,如果返回一个response对象则直接返回不在往下执行,但是所有的after_request都会执行。这一点和django中间件的process_response不同

 

posted @ 2022-07-05 17:41  耗油炒白菜  阅读(106)  评论(0编辑  收藏  举报