Flask(四)

导读:本篇文章讲解 Flask(四),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

系统转换器,自定义转换器

在 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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!