Flask03(钩子、上下文、jinji2模板)

请求钩子vue

交互过程中,有些准备或者扫尾工作需要做
求开始需要请求连接,比如db连接,outh认证,
结束时,指定数据得交互格式
通过装饰器实现,

钩子的四个分类

1、@app.before_first_request
在第一次请求之前调用(处理第一个请求前执行) ,可以在内部做一些初始化操作

@app.before_first_request
def before_first_request():
    print('before_first_request')

2、@app.before_request
在每次请求前执行,在某个修饰得一个函数中返回一个resp,视图函数不会被调用

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

3、@app.after_request
在执行完视图函数后调用,将视图函数所产生得响应传入, 在此方法中可以对响应做最后一步同意得处理

@app.after_request
def after_request(response):
    print('after_request')
    response.headers['Content-Type']='appline/jison'

    return response

4、@app.teardown_request
在每次请求后执行,接受一个参数,错误信息,有相关错误会抛出

@app.teardown_request
def teardown_request(response):
    print('teardown_request')

request

状态保持

http是一种无状态协议
无状态:用户一次请求,浏览器、服务器无法知道之前这个用户做个什么

socket与session

socket 在客户端存储的信息
session在服务端存储的信息

cookie

from flask import Flask,make_response
# make_response就是django里面的http reponse
app=Flask(__name__)
# cookie俩周后过期
@app.route('/cookie')
def set_cookie():
    resp=make_response('this is to set cookie')
    resp.set_cookie('username','laowang',max_age=3600)#max_age:设置cookie时间
    return resp
if __name__=='__main__':
    app.run()
image.png
获取cookie
#获取cookie
@app.route('/request')
def get_cookie():
    resp=request.cookies.get('username')
    return resp

访问http://127.0.0.1:5000/request

session

session 会话(敏感信息),
session依赖于cookie

# 设置session
@app.route('/index1')
def index1():
    session['leftmoney']='66666'
    return redirect(url_for('index'))
# 需要设置secret_key,用于模块hash
app.secret_key='sasdgf'
# 访问session
@app.route('/')
def index():
    return session.get('leftmoney')

访问http://127.0.0.1:5000/index1

flask上下文:

上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息。

1、request context 请求上下文,cookie 和session均属于请求上下文;
  • request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
  • session:用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。
2、application contest 应用上下文,current_app 和g均属于应用上下文对象
  • current_app:表示当前运行程序文件的程序实例。我们可以通过current_app.name打印出当前应用程序实例的名字

Manage

安装flask_script

from flask_script import Manager

from flask import Flask
app=Flask(__name__)

# Manager和app关联
manager=Manager(app)

@app.route('/')
def indef():
    return 'sadfg'

if __name__=='__main__':
    manager.run()
使用命令行的模式进行启动.ctrl+c退出
python demo_flask_script.py runserver -h 127.0.0.1 -p 8008

jinja2模板

参考Django,Jinja2的模板语法与Django的模板内容基本相似
语法:

  • 变量取值{{ }}、
  • 控制结构{% %}、
  • 注释{# #}
模板创建templates
from flask import Flask,render_template
app=Flask(__name__)


@app.route('/')
def index():
    my_str='帅的一批'
    my_array=[i for i in range(9)]
    my_int = 99
    my_dict={
        'name':'wanglong',
        'age':20
    }

    return render_template('temp_demo1.html',
                            my_str=my_str,
                           my_array=my_array,
                           my_dict=my_dict,
                           my_int=my_int

                           )

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

.html文件




    
    Title


jinja模板

昵称:{{ my_str }}
数值:{{ my_array }}
字典;{{ my_dict }}
数字:{{ my_int }}
{#运算#} my_int + 10 = {{ my_int + 10 }}
my_int + array[0] = {{ my_int +my_array[2] }}
array[3] = {{my_array.0 }}
mydict 中 name = {{my_dict['name'] }}
mydict 中 age = {{my_dict.age}}

你可能感兴趣的:(Flask03(钩子、上下文、jinji2模板))