IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 状态保持异常处理与请求钩子 -> 正文阅读

[Python知识库]状态保持异常处理与请求钩子

目录

一、状态保持

1、HTTP协议

2、cookie状态保持

设置 cookie 返回

?保存Cookies

没有保存?

?保存了??

3、session状态保持

存储session之前,需要先设置 秘钥

4、异常处理

自定义500

自定义404

5、钩子函数

第一次被访问前,钩子函数

每次被访问前,钩子函数

每次访问后,钩子函数

无论是否有异常,都会执行该结果函数


一、状态保持

?状态保持,这里我们使用两种方法 方式来完成。

cookie、session

1、HTTP协议

无状态,

为了解决这个无状态,引入了 状态保持。

状态保持,就是通过工具来让 请求之间可以实现某种联系--资源共享

2、cookie状态保持

  • 设置 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()

结果:

  • ?保存Cookies

?

获取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状态码的 异常返回,我们可以自定义来完成

  • 自定义500

@app.errorhandler(500)
def handler_500_error(error):
 ? ?return "<h1>服务器错误,请联系管理员,管理员电话是:1111</h1>"
  • 自定义404

@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的区

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-27 12:47:35  更:2021-10-27 12:48:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:53:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码