我已经阅读了几个有关此问题的问题,我还不知道这个问题的最佳解决方案是什么。假设我们有这样的模型:
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String, unique=True)
fullname = Column(String)
password = Column(String, nullable=False)
在我的控制器中,我想创建一个用户,同时验证参数并处理sqlalchemy错误以回复此请求。
验证检查:
对于验证编号3,我们可以使用验证decoraor。 对于前2个验证,我们可以添加并提交此用户,并以某种方式解析引发的sqlalchemy.exc.SQLAlchemyError错误。
但我真的不喜欢这样。因为它太脏了而且不可扩展。像uniqeness这样的一些验证需要查询db。但是检查值是否为null,不需要查询db并解析sqlAlchemyError。
处理各种类型验证的最佳方法是什么?
解析sqlAlchemyError消息并将正确的HTTP状态代码返回给客户端的最佳方法是什么?
答案 0 :(得分:2)
根据您计划对应用程序执行的操作,您可以使用wtforms的出色验证功能:
from flask_wtf import Form
from wtforms import StringField, PasswordField, SubmitField
from wtforms.fields.html5 import EmailField
from wtforms.validators import Length, Required, Email, EqualTo
class FooForm(Form):
email = EmailField('Email', validators=[Required(),Email()])
fullname = StringField('Name', validators=[Required(), Length(64)])
password = PasswordField('Password', validators=[Required(), EqualTo('password2', message='Passwords must match.'), Length(8)])
password2 = PasswordField('Password (confirm)', validators=[Required(),Length(8)])
submit = SubmitField('Submit')
它负责您的用户输入验证 - 如果某些内容不符合要求,它将在对后端进行任何类型的请求之前捕获错误。对于电子邮件uniquenes,我建议将sqla事务包装在“try:... except:”中以捕获错误并向用户闪烁相应的消息。 或者您可以按照here所述编写自己的wtforms验证器。 例如,您可以向后端发送ajax请求,并检查相关的电子邮件地址是否已被占用。