目录
一、状态保持
1、HTTP协议
2、cookie状态保持
设置 cookie 返回
?保存Cookies
没有保存?
?保存了??
3、session状态保持
存储session之前,需要先设置 秘钥
4、异常处理
自定义500
自定义404
5、钩子函数
第一次被访问前,钩子函数
每次被访问前,钩子函数
每次访问后,钩子函数
无论是否有异常,都会执行该结果函数
一、状态保持
?状态保持,这里我们使用两种方法 方式来完成。
cookie、session
1、HTTP协议
无状态,
为了解决这个无状态,引入了 状态保持。
状态保持,就是通过工具来让 请求之间可以实现某种联系--资源共享
2、cookie状态保持
from flask import Flask
from flask import request
from flask import make_response
?
app = Flask(__name__)
?
?
@app.route('/login', methods=["POST"])
def do_login():
? ?username = request.form.get("username")
? ?password = request.form.get("password")
?
? ?if username == "Tom" and password == "123":
? ? ? ?# 帐号 密码验证通过 登录成功
? ? ? ?resp = make_response("<h1>登录成功!</h1>")
? ? ? ?resp.set_cookie("username", username) ?# cookie返回
? ? ? ?return resp
? ?else:
? ? ? ?return "<h1>登录失败!</h1>"
?
?
@app.route("/comment")
def do_comment():
? ?return "<h1>评论成功!</h1>"
?
?
if __name__ == '__main__':
? ?app.run()
结果:
?
获取cookie
from flask import jsonify
?
@app.route("/comment")
def do_comment():
? ?# 先登录了 才能评论
? ?username = request.cookies.get("username") ?# 获取Cookie
? ?if not username:
? ? ? ?return jsonify({"msg": "没有登录,先登录在评论"})
?
? ?return jsonify({"msg": "评论成功!"})
结果
3、session状态保持
cookie状态存储到 客户端的
不安全、cookie存储数据量少
????????我们希望可以存储到服务器端,这个时候可以使用session机制来完成。
????????不同的浏览器对应 不同的session 每一个session都有一个唯一的标识 SID
-
存储数据到session中 -
存储session之前,需要先设置 秘钥
from flask import Flask
from flask import request
from flask import make_response
from flask import session
?
app = Flask(__name__)
?
?
# 要使用session之前,需要先配置好 密钥 secret_key
app.config["SECRET_KEY"] = "1234567890abcdefg"
?
?
@app.route('/login', methods=["POST"])
def do_login():
? ?username = request.form.get("username")
? ?password = request.form.get("password")
?
? ?if username == "Tom" and password == "123":
? ? ? ?session["username"] = username
? ? ? ?resp = make_response("<h1>登录成功!</h1>")
? ? ? ?return resp
? ?else:
? ? ? ?return "<h1>登录失败!</h1>"
?
?
if __name__ == '__main__':
? ?app.run()
结果
?我们存入session后,session默认会自动在response响应中 写入一个cookie,key就是session value值是 session的ID
from flask import Flask
from flask import request
from flask import make_response
from flask import jsonify
from flask import session
?
app = Flask(__name__)
?
?
@app.route('/login', methods=["POST"])
def do_login():
? username = request.form.get("username")
? password = request.form.get("password")
?
? if username == "刘备" and password == "123":
? ? ? session["username"] = username
? ? ? resp = make_response("<h1>登录成功!</h1>")
? ? ? return resp
? else:
? ? ? return "<h1>登录失败!</h1>"
?
if __name__ == '__main__':
? app.run()
结果
?flask会根据 获取的session cookie 获取到 session的ID 然后根据SID去找到session会话缓存区,进而找之前存储的数据。
from flask import Flask
from flask import request
from flask import make_response
from flask import jsonify
from flask import session
?
app = Flask(__name__)
?
?
@app.route("/comment")
def do_comment():
? ?# 先登录了 才能评论
? ?username = request.cookies.get("username")
? ?if not username:
? ? ? ?return jsonify({"msg": "没有登录,先登录在评论"})
? ?return jsonify({"msg": "评论成功:{}".format(username)})
?
if __name__ == '__main__':
? ?app.run()
结果:
4、异常处理
????????abort 可以中断,并且抛出异常
????????abort抛出的异常是 HTTP状态码 才可以
from flask import abort
?
@app.route("/error")
def do_error():
? ?abort(500)
?
? ?return "<h1>我是小兵张嘎</h1>"
对于HTTP状态码的 异常返回,我们可以自定义来完成
@app.errorhandler(500)
def handler_500_error(error):
? ?return "<h1>服务器错误,请联系管理员,管理员电话是:1111</h1>"
@app.errorhandler(404)
def handler_404_error(error):
?return "<h1>我找不到回家的路<h1>"
自定义了 500响应码、404响应码的 异常返回信息
????????如果是500错误,则就返回 <h1>服务器错误,请联系管理员<h1>
????????如果是404错误,则就返回<h1>我找不到回家的路<h1>
5、钩子函数
@app.route('/login', methods=["POST"])
def do_login():
? ?username = request.form.get("username")
? ?password = request.form.get("password")
? ?if username == "刘备" and password == "123":
? ? ? ?# 帐号 密码验证通过 登录成功
? ? ? ?# resp = make_response("<h1>登录成功!</h1>")
? ? ? ?# resp.set_cookie("username", username)
? ? ? ?abort(500)
? ? ? ?session["username"] = username
? ? ? ?resp = make_response("<h1>登录成功!</h1>")
? ? ? ?return resp
? ?else:
? ? ? ?return "<h1>登录失败!</h1>"
?
?
@app.route("/error")
def do_error():
? ?return "<h1>我是小兵张嘎</h1>"
?
?
@app.before_first_request
def func1():
? ?print("before_first_request")
?
?
@app.before_request
def func2():
? ?print("before_request")
?
?
@app.after_request
def func3(resp):
? ?print(resp)
? ?print("after_request")
? ?return resp
?
?
@app.teardown_request
def func4(error):
? ?print(error)
? ?print("teardown_request")
? ?return error
结果:
before_first_request
before_request
after_request
teardown_request
如果要起效果,必须是非调试模式
案例2:使用cookie做登录状态保持
扩展1: 一个电脑上的 同浏览器 访问同一个网站,会使用同一个cookie与session
扩展2: cookie 与session的区
|