使用flask wtforms验证器而不使用表单 [英] Using flask wtforms validators without using a form

查看:1246
本文介绍了使用flask wtforms验证器而不使用表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从iOS应用程序接收用户注册数据,我想使用wtforms附带的验证器来确保电子邮件和密码是可接受的。但是,由于用户从iOS文本框输入数据,因此我没有使用烧瓶表格。是否有可能使用wtforms验证器检查传入的JSON数据?

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

email_success = validate_email(用户)
username_success = validate_username(用户)

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

除了例外:
return jsonify({'Failure':0})

def validate_email(user):
如果User.query.filter_by(email = user.email).first()== None:
return 1
else:
return 0
$ b $ def validate_username(user):
如果User.query.filter_by(username = user.username).first()== None:
return 1
else:
return 0

编辑



我创建了一个注册表单:

  class RegistrationForm表单):
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,'用户名必须只有字母,数字,点或下划线')])
password = PasswordField('Password',validators = [Required()])

$ b def validate_email(self,field):
如果User 。
print(Email already registered。)
raise ValidationError('Email already registered。')
$ b $如果User.query.filter_by(username = field.data).first():
print(Username already in use。)
raise validate_username(self,field):
ValidationError('Username already in use。')

reg istration函数已被更新为:

$ pre $ 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 ':1})
else:
return jsonify({'Success':2})

除了例外:
return jsonify({'Success':3 })


解决方案

code> wtforms.Form 构造函数接受任何 MultiDict 类似接口(它只需要有 getlist ),所以你可以创建一个 werkzeug的实例。从你的JSON数据结构.MultiDict

  data = MultiDict(mapping = request。 json)
form = YourForm(data)
if form.validate():
#数据正确

(假设字段名称匹配),而且 。。

I'm receiving user registration data from an iOS application and I'd like to use the validators that come with wtforms to make sure the email and password are acceptable. However, I'm not using a flask form since users are inputting the data from iOS textfields. Is it possible to check the incoming JSON data with the wtforms validators?

@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

EDIT

I created a Registration form:

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.')

registration function has been updated to:

@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})

解决方案

Yes, this is entirely possible - the wtforms.Form constructor takes any MultiDict like interface (it just needs to have getlist), so you can just create an instance of werkzeug.datastructures.MultiDict from your JSON:

data = MultiDict(mapping=request.json)
form = YourForm(data)
if form.validate():
    # Data is correct

(assuming the field names match) and things will just work.

这篇关于使用flask wtforms验证器而不使用表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆