[英]Using flask wtforms validators without using a form
我正在從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
編輯
我創建了一個注冊表單:
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.')
注冊功能已更新為:
@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})
是的,這是完全可能的 - wtforms.Form
構造函數接受任何類似MultiDict
接口( 它只需要getlist
),因此您只需從JSON創建一個werkzeug.datastructures.MultiDict
實例:
data = MultiDict(mapping=request.json)
form = YourForm(data)
if form.validate():
# Data is correct
(假設字段名稱匹配),事情就會奏效 。
這是一個名為Flask-Inputs的小工具,我正在努力解決這個問題。 目標是允許使用wtform驗證器驗證所有傳入的數據(表單,查詢,標題等)。
以下是驗證如何與您的數據一起使用:
from flask_inputs import Inputs
from wtforms.validators import Length, Email, ValidationError
class RegisterInputs(Inputs):
json = {
'email': [Email(), unique_email],
'username': [Length(min=3, max=15), unique_username]
}
def unique_email(form, field):
if User.query.filter_by(email=field.data).first():
raise ValidationError('Email is already registered.')
def unique_username(form, field):
if User.query.filter_by(username=field.data).first():
raise ValidationError('Username is already registered.')
@auth.route('/register', methods=['POST'])
def register():
inputs = RegisterInputs(request)
if inputs.validate():
user = User.register_fromJSON(request.json)
db.session.add(user)
db.session.commit()
return jsonify(success=1)
else:
return jsonify(failure=0, errors=inputs.errors)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.