Flask上下文
Flask项目中有两个上下文,一个是应用上下文(app),另一个是请求上下文(request)。请求上下文request和应用上下文current_app都是一个全局变量,所有请求都是共享的。Flask有特殊机制可以保证每次请求的数据都是个离的,即A请求所产生的数据不会影响到B请求。所以可以直接导入request对象,也不会被一些脏数据影响,并且不需要在每个函数中使用request的时候传入request对象,这两个上下文具体的实现方式和原理可以没必要详细了解。
- request:请求上下文的对象,这个对象一般用来保存一些请求数据的变量,比如method\args\form等
- session:请求上下文的对象,这个对象一般用来保存一些会话信息。
- current_app:返回当前的app
- g:应用上下文的对象,处理请求时用作临时存储的对象。(局部变量)
from flask import Flask, session, request, current_app, g
import os
from datetime import timedelta
from utils import log_a, log_b
@app.route('/')
def index():
username =session.get('username')
g.username = username
log_a()
log_b()
hello()
# print(current_app.config['DEBUG'])
return "这是首页"
# 如果另一个方法也要调用 可以直接用g对象
def hello():
print('hello %s' % g.username)
utils文件:
# utils 工具文件 生成24位的字符串 发送验证码
# def log_a(username):
# print("log a %s" % username)
#
# def log_b(username):
# print("log b %s" % username)
from flask import g
def log_a():
print("log a %s" % g.username)
def log_b():
print("log b %s" % g.username)
钩子函数
- before_first_request:处理第一次请求之前执行。先执行它 在执行首页。
@app.before_request
def before_request():
if not hasattr(g.'user'):
setatter(g.'user', 'xxx')
- teardown_appcontext:不管是否异常,注册的函数都会在每次请求之后执行
@app.teardown_appcontext
def teardown(response):
print("teardown 被执行")
return response
- context_processor:上下文处理器。返回的字典值的键可以在模板上下文中使用
@app.context_processor
def context_processoor():
return ('current_user': 'xxxx')
errorhander: 接受状态码,可以自定义返回这种状态码的响应处理方式。
@app.reeorhander(404)
def page_not_found('error'):
return "This page does notexist",404
执行代码
先是第一次 然后是每次 最后是首页!
@app.route("/")
def index():
print("这是首页")
return "这是首页"
@app.before_first_request
def handle_first_request():
print("这是第一次请求之前执行的")
@app.before_request
def handle_before():
print("每次请求之前被执行的")
顺序为:这是第一次请求之前执行的
每次请求之前被执行的
这是首页
每次请求之后被执行的
@app.after_request
def handle_after(response):
print("每次请求之后被执行的")
return response
打印顺序:同上,handle_teardown被执行----在最后
@app.teardown_appcontext
def handle_teardown(response):
print("handle_teardown被执行")
return response
上下文处理器:
@app.route("/")
def index():
print("这是首页")
# , username='happy'
return render_template("index.html")
# return "这是首页"
@app.route("/list/")
def list():
# , username='happy'
return render_template("list.html")
@app.context_processor
def context():
return {"username": "lllggg"}
错误代码处理
@app.route("/")
def index():
# 1/0
abort(500)
print("这是首页")
# , username='happy'
return render_template("index.html")
# return "这是首页"
@app.errorhandler(404)
def page_not_find(error):
return render_template("404.html"), 404
# return "页面不存在"
@app.errorhandler(500)
def server_error(error):
return "服务器内部错误", 500