使用flask wtforms验证器而不使用表单 [英] Using flask wtforms validators without using a form
问题描述
我从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屋!