web应用框架——请求钩子+状态保持(cookie和session)+上下文+初识jinja2

一、请求钩子

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文件



    
    jinja2模板


游戏名:{{ my_str }}
数字:{{ my_int }}
数组:{{ my_array }}
字典:{{ my_dict }}
  • 运行程序


运算

  • 修改temp_demo1.html文件



    
    jinja2模板


游戏名:{{ my_str }}
数字:{{ my_int }}
数组:{{ my_array }}
字典:{{ my_dict }}

my_int + 10 ={{ my_int + 10 }}
my_int + array[0] = {{ my_int + my_array[2] }}
ayyay[3] = {{ my_array.0 }}
my_dict 中 name = {{ my_dict['name'] }}
my_dict 中 age = {{ my_dict.age }}

(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)

你可能感兴趣的:(web应用框架——请求钩子+状态保持(cookie和session)+上下文+初识jinja2)