day93:flask:Cookie&Session&请求钩子&捕获错误
目录1.HTTP的会话控制 2.Cookie 3.Session 4.请求钩子 5.捕获错误 6.上下文:context 7.Flask-Script 1.HTTP的会话控制1.什么是会话控制?
会话的开始是在用户通过浏览器第一次访问服务端网站开始. 会话的结束时在用户通过关闭浏览器以后,与服务端断开. 所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。 2.会话控制出现的原因
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。 无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。 3.会话控制的应用场景
实现状态保持主要有两种类型:
2.使用场景: 登录状态,浏览历史,网站足迹,购物车 [不登录也可以使用购物车] 3.Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用 4.Cookie基于域名安全,不同域名的Cookie是不能互相访问的 ? ?如访问luffy.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到luffy.com写的Cookie信息 5.浏览器的同源策略针对cookie也有限制作用. 6.当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息 1.设置cookie设置cookie需要通过flask的Response响应对象来进行设置,由响应对象会提供了方法set_cookie给我们可以快速设置cookie信息。 @app.route("/set_cookie") def set_cookie(): """设置cookie""" response = make_response(ok) # 格式:response.set_cookie(key="变量名",value="变量值",max_age="有效时间/秒") response.set_cookie(username",xiaoming) 如果cookie没有设置过期时间,则默认过期为会话结束过期""" cookie在客户端中保存时,用一个站点下同变量名的cookie会覆盖 response.set_cookie(age100) return response 2.获取cookie@app.route(/get_cookie get_cookie(): 获取cookie""" print(request.cookies) print(request.cookies.get()) )) 打印效果: {'username': 'xiaoming'} return "" 3.删除cookie@app.route(/del_cookie del_cookie(): 删除cookie 把对应名称的cookie设置为过期时间(0s),则可以实现删除cookie response.set_cookie("",0) return response 3.Session
2.在服务器端进行状态保持的方案就是 3.Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。 4.flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错. 5.session的有效期默认是会话期,会话结束了,session就废弃了。 6.如果将来希望session的生命周期延长,可以通过修改cookie中的sessionID来完成配置。 1.设置sessionfrom flask import Flask,make_response,request,session app = Flask(__name__) class Config(): flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错. SECRET_KEY = 123456asdadad DEBUG = True app.config.from_object(Config) @app.route(/set_session set_session(): 设置session与cookie不同,session支持python基本数据类型作为值 session["] = xiaohuihuiinfo"] = { ":11sex:True,} " if __name__ == '__main__': app.run(debug=True) 2.获取session@app.route(/get_session get_session(): 获取sessionprint( session.get() ) " 3.删除session@app.route(/del_session del_session(): 删除sessiontry: del session[] session.clear() # 删除所有 exceptpass " Tip:如何查看当前flask默认支持的所有配置项Config(): SECRET_KEY = True app.config.from_object(Config) 查看当前flask默认支持的所有配置项 (app.config) 下面是flask默认支持的所有配置项 <Config { 'DEBUG': False,'TESTING': False,'PROPAGATE_EXCEPTIONS': None,'PRESERVE_CONTEXT_ON_EXCEPTION': None,'SECRET_KEY': None,'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31),'USE_X_SENDFILE': False,'LOGGER_NAME': '__main__','LOGGER_HANDLER_POLICY': 'always','SERVER_NAME': None,'APPLICATION_ROOT': None,'SESSION_COOKIE_NAME': 'session','SESSION_COOKIE_DOMAIN': None,'SESSION_COOKIE_PATH': None,'SESSION_COOKIE_HTTPONLY': True,'SESSION_COOKIE_SECURE': False,'SESSION_REFRESH_EACH_REQUEST': True,'MAX_CONTENT_LENGTH': None,'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0,43200),'TRAP_BAD_REQUEST_ERRORS': False,'TRAP_HTTP_EXCEPTIONS': False,'EXPLAIN_TEMPLATE_LOADING': False,'PREFERRED_URL_SCHEME': 'http','JSON_AS_ASCII': True,'JSON_SORT_KEYS': True,'JSONIFY_PRETTYPRINT_REGULAR': True,'JSONIFY_MIMETYPE': 'application/json','TEMPLATES_AUTO_RELOAD': None """ 4.请求钩子
为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设置的功能,即请求钩子。 请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
) @app.before_first_request first_request(): print(1. 项目启动以后,首次被请求时,会自动执行[项目全局初始化工作]) @app.before_request before_request(): 2. 每次客户端请求时,都会自动执行,常用于记录访问日志,进行权限判断,身份识别,访问限流...) @app.after_request after_request(response): 4. 每次视图执行以后,会自动执行 after_request执行以后,必须要返回结果给客户端!! return response @app.teardown_request teardown_request(exc): 5. after_request完成以后,如果有发生异常,在关闭DEBUG模式的情况下可以接受异常对象,进行异常的记录,异常通知(exc) @app.route(/ set_session(): 3. 视图执行了.......: app.run(debug=False) 第1次请求时打印: 1. 项目启动以后,首次被请求时,会自动执行[项目全局初始化工作] 第2次请求时打印: 2. 每次客户端请求时,都会自动执行,常用于记录访问日志,进行权限判断,身份识别,访问限流... 5.捕获错误flask中内置了app.errorhander提供给我们捕获异常,实现一些在业务发生错误时的自定义处理。 1. 通过http状态码捕获异常信息 2. 通过异常类进行异常捕获
1.比如统一处理状态码为500的错误给用户友好的提示: @app.errorhandler(500 internal_server_error(e): 服务器搬家了' 2.捕获指定系统异常类 @app.errorhandler(ZeroDivisionError) zero_division_error(e): 除数不能为0' 3.也可以捕获自定义异常类 Flask app = Flask() 加载配置""" Config(): DEBUG = True app.config.from_object(Config) 捕获系统异常或者自定义异常 APIError(Exception): pass @app.route( index(): raise APIError(api接口调用参数有误!个人中心,视图执行了!! @app.errorhandler(APIError) error_apierror(e): 错误: %s" % e : app.run(host=localhost |