美文网首页
在Flask中使用装饰器统一验证接口参数

在Flask中使用装饰器统一验证接口参数

作者: 霡霂976447044 | 来源:发表于2020-06-23 10:37 被阅读0次

使用装饰器的方式,拦截请求参数。提前定义好请求参数类,使用marshmallow实现。

import functools

from flask import request
from marshmallow import Schema, ValidationError

from app.response import ResponseCode, error_json
from config import current_config


def validate_schema(schema_class: Schema):
    """验证表单的验证器。会动态设置request.schema_data属性"""

    def decorator(view_func):
        @functools.wraps(view_func)
        def inner(*args, **kwargs):
            if request.method == 'GET':
                form_data = request.args
            else:
                if request.json:
                    form_data = request.json
                else:
                    form_data = request.form
            try:
                data = schema_class().load(form_data)
                request.schema_data = data
            except ValidationError as e:
                if current_config.DEBUG:
                    return error_json(ResponseCode.PARAMETER_ERROR, e.messages)
                else:
                    return error_json(ResponseCode.PARAMETER_ERROR, '参数错误')  # 生产模式的时候,防止恶意用户直接得到参数列表
            return view_func(*args, **kwargs)

        return inner

    return decorator

定义Schema

from marshmallow import fields, validates, validate, ValidationError

from .base_validator import BaseSchema
from .token_validator import TokenSchema


class UserSchema(object):
    password = fields.String(required=True, validate=validate.Length(min=6, max=20))
    username = fields.String(required=True, validate=validate.Length(min=2, max=20))
    tel = fields.String(required=True, validate=validate.Length(min=11, max=11))

    code = fields.String(required=True, validate=validate.Length(min=1))

    _is_openid = fields.Bool(missing=False)
    _access_token = fields.String(missing='')
    _unionid = fields.String(missing='')
    openid = fields.String(required=True)
    unionid = fields.String(required=True)


class PutPasswordSchema(BaseSchema):
    old_password = UserSchema.password
    new_password = UserSchema.password

在视图中使用

@bp.route('/users/password', methods=['PUT'])
@validate_schema(user_valiadtor.PutPasswordSchema)
def put_users_password():
    """用户用户密码
    """
    uid = g.uid
    old_password = request.schema_data.get('old_password')
    new_password = request.schema_data.get('new_password')
    ......

相关文章

  • 在Flask中使用装饰器统一验证接口参数

    使用装饰器的方式,拦截请求参数。提前定义好请求参数类,使用marshmallow实现。 定义Schema 在视图中使用

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • Flask WTForms 表单验证

    本文主要内容 如何在 flask 中对参数进行校验 Wtforms 的使用 一:参数验证的必要性 当你处理浏览器提...

  • Python装饰器9-函数装饰器的应用

    函数装饰器应用场景-权限验证 执行结果: 小结 Python装饰器在Flask中一个典型的应用场景就是权限验证

  • Python | 装饰器

    使用场景 装饰器 ' @ ' 使用 带参数装饰器 装饰器类

  • 使用Flask开发简单接口(2)--POST请求接口

    今天我们继续学习如何使用Flask开发POST接口:用户注册接口和用户登录接口。 request接收参数 当我们在...

  • python 装饰器

    遇到的问题点 flask项目里面的装饰器处理权限验证 java里面好像也是靠装饰器来处理该问题def permis...

  • 接口规范

    统一接口命名 /接口版本/模块/对象/行为 统一请求头 请求参数和返回参数统一使用驼峰命名法 接口请求 时间,方法...

  • nestjs守卫

    守卫是一个使用@injectable装饰器的类,守卫应该实现canactivate接口 接收单个参数,execut...

  • Python进阶 装饰器

    一切皆对象 原始的装饰器 使用@的装饰器 蓝本规范 带参数的装饰器 装饰器类

网友评论

      本文标题:在Flask中使用装饰器统一验证接口参数

      本文链接:https://www.haomeiwen.com/subject/oimcfktx.html