系统转换器,自定义转换器
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要过滤指定用户, 所以可以使用转换器实现
转换器的本质:通过正则表达式,匹配路由地址
一.系统自带转换器
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。
二.自定义转换器
自定义转换器,具体实现步骤为:
- 导入转换器基类(BaseConverter):Flask中所有的路由的匹配规则,都是使用转换器实现
- 自定义转换器:自定义类继承于转换器基类
- 添加转换器到默认的转换器字典中
- 使用自定义转换器实现自定义匹配规则
代码实现
from flask import Flask
#导入基类转换器
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1.自定义类,继承自BaseConverter
class MyRegexConverter(BaseConverter):
# 2.编写初始化方法, init方法, 接收两个参数, url_map, regex, 并初始化父类空间和子类空间
def __init__(self,url_map,regex):
super(MyRegexConverter, self).__init__(url_map)
self.regex = regex
# 3.将自定义转换器类,添加到默认的转换列表中
app.url_map.converters['re'] = MyRegexConverter
#使用自定义转换器
#接收3位整数
@app.route('/<re("\d{3}"):num>')
def hello_world(num):
print("num = %s"%num)
return "the num is %s"%num
#接收一个手机号
@app.route('/<re("1[345678]\d{9}"):mobile>')
def get_phone_number(mobile):
return "the mobile is %s"%mobile
if __name__ == '__main__':
app.run()
abort,errorhandler,异常处理
一.abort,异常抛出
abort(code):主动抛出异常状态码
参数code:HTTP的错误状态码
例如:abort(404)
二.errorhandler,异常捕获
- errorhandler(code_or_exception):用来监听捕捉异常,然后返回自定义的页面处理
- 参数:code_or_exception – HTTP的错误状态码或指定异常
代码演示:
from flask import Flask,abort
app = Flask(__name__)
@app.route('/game/<int:age>')
def play_game(age):
#异常抛出
abort(404)
return "helloworld"
#异常捕获
@app.errorhandler(404)
def page_not_found(e):
print(e)
return "找不到服务器资源,服务器搬家了"
if __name__ == '__main__':
app.run()
请求勾子
在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:
在请求开始时,建立数据库连接;
在请求开始时,根据需求进行权限校验;
在请求结束时,指定数据的交互格式;
为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
- before_first_request:在处理第一个请求前执行
before_request:在每次请求前执行,在该装饰函数中,一旦return,视图函数不再执行
after_request:如果没有抛出错误,在每次请求后执行
接受一个参数:视图函数作出的响应
在此函数中可以对响应值,在返回之前做最后一步处理,再返回
teardown_request:在每次请求后执行
接受一个参数:用来接收错误信息
from flask import Flask
from flask import abort
app = Flask(__name__)
# 在第一次请求之前调用,可以在此方法内部做一些初始化操作
@app.before_first_request
def before_first_request():
print("before_first_request")
# 在每次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验
# 如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数
@app.before_request
def before_request():
print("before_request")
# if 请求不符合条件:
# return "laowang"
# 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
@app.after_request
def after_request(response):
print("after_request")
response.headers["Content-Type"] = "application/json"
return response
# 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(e):
print("teardown_request")
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run(debug=True)
- 在第1次请求时的打印:
before_first_request
before_request
after_request
teardown_request
- 在第2,3,…n次请求时的打印:
before_request
after_request
teardown_request
request
request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)
常用的属性如下:
属性 说明 类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录请求中的查询参数 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77015.html