1. 异常捕获
1.1 主动抛出HTTP异常
-
-
抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。
-
-
参数:
-
code – HTTP的错误状态码
-
# abort(404) abort(500)
抛出状态码的话,只能抛出 HTTP 协议的错误状态码
1.2 捕获错误
-
-
注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
-
-
参数:
-
code_or_exception – HTTP的错误状态码或指定异常
-
-
例如统一处理状态码为500的错误给用户友好的提示:
@app.errorhandler(500) def internal_server_error(e): return '服务器搬家了'
- 捕获指定异常类型
@app.errorhandler(ZeroDivisionError) def zero_division_error(e): return '除数不能为0'
class APIError(Exception): pass """抛出http异常和异常捕获""" # 不仅可以不同的http请求错误 @app.errorhandler(404) def errorhandler404(exc): """声明的异常处理函数, 必须设置一个位置参数来接收异常处理对象""" return '<h1 style="text-align: center;margin-top: 200px;">服务器搬家了</h1>' # 还可以针对指定的异常类型进行捕获 @app.errorhandler(APIError) def errorhandlerapi(exc): return '<h1 style="text-align: center;margin-top: 200px;">API挂了!</h1>'
2. 上下文
Flask中有两种上下文,请求上下文(request context)和应用上下文(application context)。
Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。
- application 指的就是当你调用app = Flask(__name__)创建的这个对象app;
- request 指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.__call__()之后,在Flask对象内部创建的Request对象;
- application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
- application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request
在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session
-
request
-
封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
-
-
session
-
用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。
-
2.2
应用上下文对象有:current_app,g
-
应用的启动脚本是哪个文件,启动时指定了哪些参数
-
加载了哪些配置文件,导入了哪些配置
-
连接了哪个数据库
-
有哪些可以调用的工具类、常量
-
当前flask应用在哪个机器上,哪个IP上运行,内存多大
current_app.name current_app.test_value='value'
g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别
g.name='abc'
注意:不同的请求,会有不同的全局变量
-
-
应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
pip install flask-script
集成 Flask-Script到flask应用中
from flask import Flask app = Flask(__name__) """使用flask_script启动项目""" from flask_script import Manager manage = Manager(app) @app.route('/') def index(): return 'hello world' if __name__ == "__main__": manager.run()
Flask-Script 还可以为当前应用程序添加脚本命令
"""自定义flask_script终端命令""" from flask_script import Command class HelloCommand(Command): """命令的相关描述""" def run(self): with open("text.txt","w") as f: f.write("hello hello") pass print("这是执行了hello命令") manage.add_command('hello', HelloCommand() )