一、请求钩子
1.含义
交互过程中,有些准备或者扫尾工作需要,比如请求开始: db链接, auth认证,结束时, 指定数据的交互格式,请求钩子通过装饰器实现的,有四种模式:
- 1.在第一次请求之前调用(在处理第一个请求之前执行), 可以在此方法内部做一些初始化操作
- 2、在每次请求之前执行,如果在某修饰的一个函数中返回了一个resp, 视图函数将不会被调用
- 3.执行完视图函数调用,并且把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
- 4.在每次请求之后执行,接受一个参数, 错误信息,如果有相关的错误就会抛出
2.例子
- 新建一个demo_gouzi.py文件,前两个模式例子:
from flask import Flask
app = Flask(__name__)
# 请求钩子
# 交互过程中,有些准备或者扫尾工作需要
# 比如请求开始: db链接, auth认证,
# 结束时, 指定数据的交互格式
# 请求钩子通过装饰器实现的, 4
# 1、在第一次请求之前调用(在处理第一个请求之前执行), 可以在此方法内部做一些初始化操作
@app.before_first_request
def before_first_request():
print('before_first_request')
# 2、在每次请求之前执行,如果在某修饰的一个函数中返回了一个resp, 视图函数将不会被调用
@app.before_request
def before_request():
print('before_request')
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run(debug=True)
-
当我刷新网址的时候:
-
我们可以查看其content-type类型
-
第三个模式例子
# 执行完视图函数调用,并且把视图函数所生成的响应传入
# 可以在此方法中对响应做最后一步统一的处理
@app.after_request
def after_request(response):
print('after_request')
response.headers['Content-Type'] = "application/json"
return response
我们可以看到连content-type类型也进行了更改
- 第四个模式例子
# 在每次请求之后执行,接收一个参数, 错误信息,如果有相关的错误就会抛出
@app.teardown_request
def teardown_request(response):
print('teardown_request')
二、请求上下文
三、状态保持
1.cookie
http是一种无状态协议
无状态:用户一次请求,浏览器、服务器无法知道之前这个用户做过什么
- cookie 在客户端存储的信息
- session 在服务端存储的信息
例子
- 返回数据
from flask import Flask,make_response
#django里面的http response
app = Flask(__name__)
@app.route('/cookie')
def set_cookie():
resp = make_response('this is to set cookie')
resp.set_cookie('username','gufei')
return resp
if __name__ == '__main__':
app.run()
-
从看看cookie过期时间
- 修改cookie过期时间
# max_age 设置cookie的时间
resp.set_cookie('username','gufei',max_age = 3600)
- 获取cookie
from flask import Flask,make_response,request
...
#获取cookie
@app.route('/request')
def get_cookie():
resp = request.cookies.get('username')
return resp
2.session
session 会话 (敏感重要的信息, 余额。验证码) ,session 依赖于cookie
- 设置session
from flask import Flask, make_response, request, session, redirect, url_for
...
# session 会话 (敏感重要的信息, 余额。验证码) tf
# session 依赖于cookie
# 设置session
@app.route('/index1')
def index1():
session['lefmoney'] = '99999'
return redirect(url_for('index'))
# 需要设置secret_key 用于一些模块 hash
app.secret_key = 'soda'
@app.route('/')
def index():
if session.get('lefmoney'):
return session.get('lefmoney')
return 'haha'
另一种方式:
return session.get('letmoney','0')
image.png
3.上下文
上下文:
- request context 请求上下文 ,cookie session
- application context 应用上下文 current_app g
from flask import Flask, make_response, request, session, redirect, url_for, current_app
...
print(current_app.name)
四、flask script
- 新建一个demo_flask_script.py文件
from flask import Flask
# 导入
from flask_script import Manager
app = Flask(__name__)
# 把Manager 和 app进行关联
manager = Manager(app)
@app.route('/')
def index():
return 'haha'
if __name__ == '__main__':
manager.run()
当我运行的时候,提示我没有flask_script这个包,于是我安装了一下
pip install flask_script
-
再次运行
出现这种情况我们使用命令行启动程序
python demo_flask_script.py runserver -h 127.0.0.1 -p 8008
- 我们可以通过下面这个命令查看参数:
python demo_flask_script.py runserver --help
五、JinJa2模板
-
新建一个名为templates的文件夹(名字不能错)
传值
- 新建一个demo_template2.py文件
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
#字符串
my_str = '阴阳师'
#num
my_int = 99
my_array = [i for i in range(9)]
my_dict = {
"name" : '大天狗',
"age" : 18
}
#render_template进行模板渲染
return render_template('temp_demo1.html',
my_str = my_str,
my_int = my_int,
my_array = my_array,
my_dict = my_dict,
)
if __name__ == '__main__':
app.run()
- 再在templates文件夹中创建一个temp_demo1.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jinja2模板</title>
</head>
<body>
游戏名:{{ my_str }}<br>
数字:{{ my_int }}<br>
数组:{{ my_array }}<br>
字典:{{ my_dict }}<br>
</body>
</html>
-
运行程序
运算
- 修改temp_demo1.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jinja2模板</title>
</head>
<body>
游戏名:{{ my_str }}<br>
数字:{{ my_int }}<br>
数组:{{ my_array }}<br>
字典:{{ my_dict }}<br>
<hr>
my_int + 10 ={{ my_int + 10 }}<br>
my_int + array[0] = {{ my_int + my_array[2] }}<br>
ayyay[3] = {{ my_array.0 }}<br>
my_dict 中 name = {{ my_dict['name'] }}<br>
my_dict 中 age = {{ my_dict.age }}<br>
</body>
</html>
(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)
网友评论