MST

星途 面试题库

面试题:Python中Flask构建RESTful API时如何处理请求参数验证

在使用Flask构建RESTful API过程中,常常需要对客户端发送过来的请求参数进行验证。请阐述你通常使用什么方法来实现参数验证,例如验证参数类型、是否必填等,可结合代码示例说明。
19.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

在Flask中进行请求参数验证,常见的方法有以下几种:

使用 Flask-Request-Validator 扩展

  1. 安装
    pip install Flask-Request-Validator
    
  2. 示例代码
    from flask import Flask, request
    from flask_request_validator import validate_params, Param, GET
    
    app = Flask(__name__)
    
    @app.route('/example', methods=['GET'])
    @validate_params(
        Param('param1', GET, int, required=True),
        Param('param2', GET, str, required=False)
    )
    def example_route(param1, param2=None):
        return {
            'param1': param1,
            'param2': param2
        }
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    在此示例中,@validate_params 装饰器用于验证 GET 请求中的参数。Param 类定义了参数名、请求方法、期望的数据类型以及是否必填。

手动验证

  1. 示例代码
    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    @app.route('/example', methods=['GET'])
    def example_route():
        param1 = request.args.get('param1')
        param2 = request.args.get('param2')
    
        if param1 is None:
            return jsonify({'error': 'param1 is required'}), 400
    
        try:
            param1 = int(param1)
        except ValueError:
            return jsonify({'error': 'param1 must be an integer'}), 400
    
        return {
            'param1': param1,
            'param2': param2
        }
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    在这个手动验证的例子中,首先检查 param1 是否存在,不存在则返回错误。然后尝试将 param1 转换为整数,如果转换失败,也返回错误。

使用 WTForms 进行验证(适用于更复杂的表单验证场景,也可用于API参数验证)

  1. 安装
    pip install wtforms
    
  2. 示例代码
    from flask import Flask, request, jsonify
    from wtforms import Form, IntegerField, StringField
    from wtforms.validators import DataRequired
    
    app = Flask(__name__)
    
    
    class RequestForm(Form):
        param1 = IntegerField('param1', validators=[DataRequired()])
        param2 = StringField('param2')
    
    
    @app.route('/example', methods=['GET'])
    def example_route():
        form = RequestForm(request.args)
        if not form.validate():
            return jsonify({'error': form.errors}), 400
    
        return {
            'param1': form.param1.data,
            'param2': form.param2.data
        }
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    这里定义了一个 RequestForm 类,继承自 Form。通过 IntegerFieldStringField 定义参数类型,并使用 DataRequired 验证器指定 param1 为必填。在路由函数中,使用 form.validate() 方法进行验证。