使用flask wtforms验证器而不使用表单

Bro*_*sef 4 python flask

我正在从iOS应用程序接收用户注册数据,我想使用wtforms附带的验证器来确保电子邮件和密码可以接受.但是,我没有使用烧瓶形式,因为用户正在从iOS文本字段输入数据.是否可以使用wtforms验证器检查传入的JSON数据?

@auth.route('/register', methods=['POST'])
def register():
    try:
        user = User.register_fromJSON(request.json)

        email_success = validate_email(user)
        username_success = validate_username(user)

        if email_success == 1 and username_success == 1:
            db.session.add(user)
            db.session.commit()
            return jsonify({'Success': 1})
        else:
            return jsonify({'Failure': 0})

    except Exception:
        return jsonify({'Failure': 0})

def validate_email(user):
    if User.query.filter_by(email=user.email).first() == None:
        return 1
    else:
        return 0

def validate_username(user):
    if User.query.filter_by(username=user.username).first() == None:
        return 1
    else:
        return 0
Run Code Online (Sandbox Code Playgroud)

编辑

我创建了一个注册表单:

class RegistrationForm(Form):
    email = StringField('Email', validators=[Required(), Length(1,64), Email()])
    username = StringField('Username', validators=[Required(), Length(1, 64), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, 'Usernames must have only letters, 'numbers, dots or underscores')])
    password = PasswordField('Password', validators=[Required()])


    def validate_email(self, field):
        if User.query.filter_by(email=field.data).first():
            print("Email already registered.")
            raise ValidationError('Email already registered.')

    def validate_username(self, field):
        if User.query.filter_by(username=field.data).first():
            print("Username already in use.")
            raise ValidationError('Username already in use.')
Run Code Online (Sandbox Code Playgroud)

注册功能已更新为:

@auth.route('/register', methods=['POST'])
def register():
    try:
        data = MultiDict(mapping=request.json)
        form = RegistrationForm(data)

        if form.validate():
            user = User.register_fromJSON(request.json)
            db.session.add(user)
            db.session.commit()
            return jsonify({'Success': 1})
        else:
            return jsonify({'Success': 2})

    except Exception:
        return jsonify({'Success': 3})
Run Code Online (Sandbox Code Playgroud)

Sea*_*ira 8

是的,这是完全可能的 - wtforms.Form构造函数接受任何MultiDict类似的接口(它只需要getlist),因此您只需werkzeug.datastructures.MultiDict从JSON 创建一个实例:

data = MultiDict(mapping=request.json)
form = YourForm(data)
if form.validate():
    # Data is correct
Run Code Online (Sandbox Code Playgroud)

(假设字段名称匹配),事情就会奏效.