钩子函数和装饰器路由实现
before_request 每次请求都会触发
before_first_requrest 第一次请求前触发
after_request 请求后触发 并返回参数
teardown_request 失败后触发 并返回异常 需要传入参数接收
from flask import Flask, request # 设置对象
app = Flask(__name__,
static_url_path='/python27',
static_folder='static',
template_folder='templates') # 第一次请求之前都会调用 例如mysql连接
@app.before_first_request
def before_first_request():
print("before_first_request") # 每次请求都会被调用
@app.before_request
def before_request():
print("before_request")
# request.remote_addr 用户访问IP地址
# 判断如果访问地址在黑名单内 就return 黑名单
if request.remote_addr == "127.0.0.1":
return "黑名单" # 请求之后会调用 并且在函数里面接收一个参数 响应
@app.after_request
def after_request(response):
print("after_request")
# 对响应数据进行统一处理 response返回数据为return数据
return response # 请求失败之后会调用函数 并且将异常传入参数
@app.teardown_request
def teardown_request(error):
print("teardown_request")
return error @app.route('/')
def index():
return "hello wowlrd" if __name__ == '__main__':
app.run(host='127.0.0.1', port=8888, debug=True)
钩子函数
werkzeug工具集
Request response routing模块 other
routing模块: Rule Map BaseConverters MapAdapter
Request 常用属性
data form args cookies headers methods url files
app.route("/data", methods=['POST'])
def data():
data = request.data
print(data)
return "ok"
from flask import Flask, request app = Flask(__name__) @app.route("/")
def index():
return "index" @app.route('/data', methods=['POST'])
def data():
data = request.data
print(data)
return 'ok' @app.route("/upload", methods=['POST'])
def upload():
file = request.files.get("pic")
file.save("aaa.jpg")
return "success" if __name__ == '__main__':
app.run(debug=True)
data
状态保持
无状态:http 无状态协议 每次请求独立, 协议对事务没有记忆能力, 同一个url请求 没有上下文关系
解决无状态协议问题
客户端 cookie 服务器端 session
cookie 不同网站之间cookie不能共享 同源策略 、设置获取cookie 浏览器会自动保存cookie 、
request.cookie.get("passwd") #获取cookie值 response = make_response("success") # 设置对象 respnse.set_cookie("passwd","qwe", max_age = 3600) #设置cookie值 # 设置过期时间 max_age最大连接时间3600秒 response.delete_cookie("passwd") 删除cookie 登出
from flask import Flask, request, make_response app = Flask(__name__) @app.route("/")
def index():
username = request.cookies.get('username')
passwd = request.cookies.get('userpass')
return "%s ----- %s" % (username, passwd) @app.route("/login")
def login():
response = make_response("success")
response.set_cookie("username", "laowang")
response.set_cookie("userpass", "")
return response if __name__ == '__main__':
app.run(debug=True)
获取cookie 和 设置cookie
服务器端 session 存放敏感信 session依赖cookie
session需要设置 app.config["SECRET_KEY"] = "AWDWDAIJIAJCWJAI"
session可以放在url中
# 设置session
app.config["SECRET_KEY"] = "qwniassnidiajs"
session["user_name"] = "laowang"
session["user_id"] = "" # 获取session 如果没有 返回值为空
user_id = session.get("user_id", '')
user_name = session.get("user_name", '') # 删除session 如果已经删除 返回值为none
session.pop("user_id", None)
session.pop("user_name", None)
from flask import Flask, request, session app = Flask(__name__)
# session 加密 使用 必须大写
app.config['SECRET_KEY'] = "adwdawdaanvoirjaowe" # 获取 session
@app.route("/")
def index():
# session 依赖 cookie
user_id = session.get("user_id", '')
user_name = session.get("user_name", '')
# 返回到页面
return "%s + %s" % (user_id, user_name) # 登陆 传输session
@app.route('/login')
def login():
session['user_id'] = ""
session["user_name"] = "laowang"
return "session" # 登出 删除session
@app.route("/logout")
def logout():
session.pop("user_id" , None)
session.pop("user_name", None)
return "success" if __name__ == '__main__':
app.run(debug=True)
设置session 登陆登出
请求上下文 request context 请求发生时 可以使用
应用上下文 application context 应运启动时 可以使用
app = Flask(__name__) ------> 相等于current_app
app.route('/')
def login():
print(request.method)
print(current_app.config.get("DEBUG"))
未完待续