| 正则匹配路由在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问 具体实现步骤为:  
 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录自定义转换器:自定义类继承于转换器基类添加转换器到默认的转换器字典中使用自定义转换器实现自定义匹配规则 代码实现from werkzeug.routing import BaseConverter 
 
  
 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re app = Flask(__name__)
 @app.route('/user/<re("[0-9]{3}"):user_id>') def user_info(user_id): return "user_id 为 %s" % user_id 
  
 运行测试:http://127.0.0.1:5000/user/123 ,如果访问的url不符合规则,会提示找不到页面 自定义转换器其他两个函数实现继承于自定义转换器之后,还可以实现 to_python 和 to_url 这两个函数去对匹配参数做进一步处理:  
 to_python: 
   
   该函数参数中的 value 值代表匹配到的值,可输出进行查看匹配完成之后,对匹配到的参数作最后一步处理再返回,比如:转成 int 类型的值再返回: class RegexConverter(BaseConverter): def __init__(self, url_map, *args): super(RegexConverter, self).__init__(url_map) 
  
 运行测试,在视图函数中可以查看参数的类型,由之前默认的 str 已变成 int 类型的值  
 to_url: 
   
   在使用 url_for 去获取视图函数所对应的 url 的时候,会调用此方法对 url_for 后面传入的视图函数参数做进一步处理具体可参见 Flask 的 app.py 中写的示例代码:ListConverter 系统自带转换器DEFAULT_CONVERTERS = {
    'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。
  
 异常捕获HTTP 异常主动抛出 
  abort 方法 
    
    抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。参数: 
     
  
  抛出状态码的话,只能抛出 HTTP 协议的错误状态码  捕获错误 
  errorhandler 装饰器 
    
    注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法参数: 
    
    code_or_exception – HTTP的错误状态码或指定异常例如统一处理状态码为500的错误给用户友好的提示: @app.errorhandler(500) def internal_server_error(e): return '服务器搬家了' 
 @app.errorhandler(ZeroDivisionError) def zero_division_error(e): return '除数不能为0'
 可以全局捕获404错误,返回渲染的404页面.
 
 
 请求勾子(相当于Django中的中间件)在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:  
  在请求开始时,建立数据库连接;在请求开始时,根据需求进行权限校验;在请求结束时,指定数据的交互格式; 为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。 请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:  
  before_first_request 
    before_request 
    
    在每次请求前执行如果在某修饰的函数中返回了一个响应,视图函数将不再被调用after_request 
    
    如果没有抛出错误,在每次请求后执行接受一个参数:视图函数作出的响应在此函数中可以对响应值在返回之前做最后一步修改处理需要将参数中的响应在此参数中进行返回teardown_request: 
    
    在每次请求后执行接受一个参数:错误信息,如果有相关错误抛出 代码测试from flask import Flask from flask import abort app = Flask(__name__) 
 before_first_request
before_request
after_request
teardown_request
 before_request
after_request
teardown_request
 
 
 
 
 |