flaskrequest获取raw参数_Flask框架(请求钩⼦,异常捕获,
上下⽂,⾃定义。。。
知乎视频w ww.zhihu
知乎视频w ww.zhihu
请求钩⼦
在客户端和服务器交互的过程中,有些准备⼯作或扫尾⼯作需要处理,⽐如:
在请求开始时,建⽴数据库连接;
在请求开始时,根据需求进⾏权限校验;
在请求结束时,指定数据的交互格式;
为了让每个视图函数避免编写重复功能的代码,Flask提供了通⽤设置的功能,即请求钩⼦。
请求钩⼦是通过装饰器的形式实现,Flask⽀持如下四种请求钩⼦:
before_first_request
在处理第⼀个请求前执⾏[项⽬初始化时的钩⼦]
before_request
在每次请求前执⾏
如果在某修饰的函数中返回了⼀个响应,视图函数将不再被调⽤
after_request
如果没有抛出错误,在每次请求后执⾏
接受⼀个参数:视图函数作出的响应
在此函数中可以对响应值在返回之前做最后⼀步修改处理
需要将参数中的响应在此参数中进⾏返回
teardown_request:
在每次请求后执⾏
接受⼀个参数:错误信息,如果有相关错误抛出
需要设置flask的配置DEBUG=False,teardown_request才会接受到异常对象。
代码
from flask import Flask,request
# 初始化
app = Flask(import_name=__name__)
# 声明和加载配置
class Config():
DEBUG = True
@app.before_first_request
def before_first_request():
"""
这个钩⼦会在项⽬启动后第⼀次被⽤户访问时执⾏
可以编写⼀些初始化项⽬的代码,例如,数据库初始化,加载⼀些可以延后引⼊的全局配置
"""
print("----before_first_request----")
print("系统初始化的时候,执⾏这个钩⼦⽅法")
print("会在接收到第⼀个客户端请求时,执⾏这⾥的代码")
@app.before_request
def before_request():
"""
这个钩⼦会在每次客户端访问视图的时候执⾏
# 可以在请求之前进⾏⽤户的⾝份识别,以及对于本次访问的⽤户权限等进⾏判断。..
"""
print("----before_request----")
print("每⼀次接收到客户端请求时,执⾏这个钩⼦⽅法")
print("⼀般可以⽤来判断权限,或者转换路由参数或者预处理客户端请求的数据")
@app.after_request
def after_request(response):
print("----after_request----")
print("在处理请求以后,执⾏这个钩⼦⽅法")
print("⼀般可以⽤于记录会员/管理员的操作历史,浏览历史,清理收尾的⼯作")
response.headers["Content-Type"] = "application/json"
response.headers["Company"] = ""
# 必须返回response参数
return response
@ardown_request
def teardown_request(exc):
print("----teardown_request----")
print("在每⼀次请求以后,执⾏这个钩⼦⽅法")
print("如果有异常错误,则会传递错误异常对象到当前⽅法的参数中")
# 在项⽬关闭了DEBUG模式以后,则异常信息就会被传递到exc中,我们可以记录异常信息到⽇志⽂件中 print(exc)
# 编写路由视图
@ute(rule='/')
def index():
print("-----------视图函数执⾏了---------------")
return "<h1>hello world!</h1>"
if __name__ == '__main__':
# 运⾏flask
app.run(host="0.0.0.0")
在第1次请求时的打印:
----before_first_request----
系统初始化的时候,执⾏这个钩⼦⽅法
会在接收到第⼀个客户端请求时,执⾏这⾥的代码
flask下载----before_request----
127.0.0.1 - - [04/Aug/2020 14:40:22] "GET / HTTP/1.1" 200 -
每⼀次接收到客户端请求时,执⾏这个钩⼦⽅法
⼀般可以⽤来判断权限,或者转换路由参数或者预处理客户端请求的数据
-----------视图函数执⾏了---------------
----after_request----
在处理请求以后,执⾏这个钩⼦⽅法
⼀般可以⽤于记录会员/管理员的操作历史,浏览历史,清理收尾的⼯作
----teardown_request----
在每⼀次请求以后,执⾏这个钩⼦⽅法
如果有异常错误,则会传递错误异常对象到当前⽅法的参数中
None
在第2次请求时的打印:
----before_request----
每⼀次接收到客户端请求时,执⾏这个钩⼦⽅法
⼀般可以⽤来判断权限,或者转换路由参数或者预处理客户端请求的数据
127.0.0.1 - - [04/Aug/2020 14:40:49] "GET / HTTP/1.1" 200 -
-----------视图函数执⾏了---------------
----after_request----
在处理请求以后,执⾏这个钩⼦⽅法
⼀般可以⽤于记录会员/管理员的操作历史,浏览历史,清理收尾的⼯作
-
---teardown_request----
在每⼀次请求以后,执⾏这个钩⼦⽅法
如果有异常错误,则会传递错误异常对象到当前⽅法的参数中
None
异常捕获
主动抛出HTTP异常
abort ⽅法
抛出⼀个给定状态代码的 HTTPException 或者 指定响应,例如想要⽤⼀个页⾯未到异常来终⽌请求,你可以调⽤ abort(404)参数:
code – HTTP的错误状态码
# abort(404)
abort(500)
抛出状态码的话,只能抛出 HTTP 协议的错误状态码
abort在⼯作中基本不会被使⽤,⼯作中的异常抛出往往在业务错误的时候使⽤raise进⾏抛出错误类型,⽽不是抛出http异常。
捕获错误
errorhandler 装饰器
注册⼀个错误处理程序,当程序抛出指定错误状态码的时候,就会调⽤该装饰器所装饰的⽅法
参数:
code_or_exception – HTTP的错误状态码或指定异常
例如统⼀处理状态码为500的错误给⽤户友好的提⽰:
@handler(500)
def internal_server_error(e):
return '服务器搬家了'
捕获指定异常类型(0不可以作为除数)
@handler(ZeroDivisionError)
def zero_division_error(e):
return '除数不能为0'
代码:
from flask import Flask
# 创建flask应⽤
app = Flask(__name__)
"""加载配置"""
class Config():
DEBUG = True
"""
flask中内置了hander提供给我们捕获异常,实现⼀些在业务发⽣错误时的⾃定义处理。
1. 通过http状态码捕获异常信息
2. 通过异常类进⾏异常捕获
"""
"""1. 捕获http异常[在装饰器中写上要捕获的异常状态码也可以是异常类]"""
@handler(404)
def error_404(e):
return "<h1>您访问的页⾯失联了!</h1>"
# return redirect("/") # 如果失效⽹页,那么就返回⾸页
# 异常捕获
@ute(rule="/11")
def index11():
print('------------视图函数执⾏-------------')
abort(404) # The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
# abort(403) # Not Found
return "<h1>hello world!</h1>"
@handler(ZeroDivisionError)
def error_zero(exc):
print("0不能是除数")
return "0不能是除数"
@ute(rule="/zero")
def index1():
1/0
return '111'
"""2. 捕获系统异常或者⾃定义异常"""
class APIError(Exception):
pass
@ute("/")
def index():
raise APIError("api接⼝调⽤参数有误!")
return "个⼈中⼼,视图执⾏了!!"
@handler(APIError)
def error_apierror(e):
return "错误: %s" % e
if __name__ == '__main__':
app.run(host="localhost",port=8080)
context
执⾏上下⽂:即语境,语意,在程序中可以理解为在代码执⾏到某⼀⾏时,根据之前代码所做的操作以及下⽂即将要执⾏的逻辑,可以决定在当前时刻下可以使⽤到的变量,或者可以完成的事情。
Flask中上下⽂对象:相当于⼀个容器,保存了 Flask 程序运⾏过程中的⼀些信息[变量、函数、类与对象等信息]。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论