Python 如何使用Flask SQL Alchemy在JSON中显示表单中的约束错误?

Python 如何使用Flask SQL Alchemy在JSON中显示表单中的约束错误?,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,现在,我的项目接受表单中的用户信息,并以JSON格式作为POST请求返回信息。创建的用户也会保存到数据库中。这正是我想要做的,但是如果用户输入的信息不满足其约束,我希望结束路由列出JSON,显示错误。例如: { "errors": { "color": [ "Invalid value, must be one of: red, blue, yellow" ], "email"

现在,我的项目接受表单中的用户信息,并以JSON格式作为POST请求返回信息。创建的用户也会保存到数据库中。这正是我想要做的,但是如果用户输入的信息不满足其约束,我希望结束路由列出JSON,显示错误。例如:

{
  "errors": {
    "color": [
      "Invalid value, must be one of: red, blue, yellow"
    ],
    "email": [
      "This field is required."
    ]
  }
}
我认为您可以在模型类中创建一些东西,在约束不满足时处理这些错误。然而,我在Flask SQL Alchemy文档或在线搜索中找不到任何关于这方面的信息。现在,如果用户输入了错误的输入类型(即年份字段中的字母),则会显示sqlalchemy.exc.DataError以及一系列回溯。如果用户的输入超过字段的字符限制,也会发生这种情况。此外,当跳过输入字段时,它只是在创建的JSON中的字段中显示“”,而不是说明“此字段是必需的”。我如何创建上面的JSON来显示这些错误?我的代码在下面

“”“app.py”“”

########################“”“models.py”“”##########################

#########################“”“index.html”“”##########################


标题
姓名:
出生年份:
电邮:
颜色:
提交

您可以查看以下库:

棉花糖将使用对象处理用户输入验证。 它与SQL炼金术模型非常相似

混合用户输入和数据库模型可能会造成更大的复杂性。 你可以把它们分开

您可以为您的请求创建验证对象,如下所示:

从烧瓶导入烧瓶,jsonify
从棉花糖导入模式,字段,验证
从webargs.flaskparser导入使用
从数据类导入数据类,asdict
app=烧瓶(名称)
app.config['JSONIFY\u PRETTYPRINT\u REGULAR']=True
@应用程序错误处理程序(422)
@app.errorhandler(400)
def句柄_错误(err):
“”“将验证错误作为JSON返回”“”
headers=err.data.get(“headers”,无)
messages=err.data.get(“messages”,[“无效请求”。]))
如果标题为:
返回jsonify({“errors”:messages})、err.code、头
其他:
返回jsonify({“errors”:messages}),err.code
类UserSchema(模式):
“”“此类处理用户输入和验证”“”
name=fields.Str(必需=True)
年份=字段.Int(必需=真,严格=真,
验证=验证。范围(最小值=1900,最大值=2100))
email=fields.email(必需=True)
color=fields.String(必需=True,validate=validate.OneOf([
“红色”,
“蓝色”,
“黄色”,
]))
@数据类
类用户:
“”“这个类可以被sql alchemy或其他任何东西代替。”
与对象“”相关的业务逻辑
姓名:str
年份:整数
电邮:str
颜色:str
@app.route(“/api”,methods=[“POST”])
@使用参数(UserSchema(),location=“json”)
def json_api(参数):
#创建用户对象
用户=用户(**args)
#处理它
...
#作出反应
返回jsonify(asdict(用户))
使用以下curl请求对其进行测试:

set-x
curl-X POST localhost:5000/api\
--标题“内容类型:应用程序/json”\
--数据“{}”
curl-X POST localhost:5000/api\
--标题“内容类型:应用程序/json”\
--数据“{”颜色“:“绿色”,“foobar”:42}”
curl-X POST localhost:5000/api\
--标题“内容类型:应用程序/json”\
--数据“{”颜色“:”红色“,”姓名“:”我“,”年份“:”1950,“电子邮件“:”me@web.com"}'
您得到了以下结果:

+ curl -X POST localhost:5000/api --header 'Content-Type: application/json' --data '{}'
{
  "errors": {
    "json": {
      "color": [
        "Missing data for required field."
      ], 
      "email": [
        "Missing data for required field."
      ], 
      "name": [
        "Missing data for required field."
      ], 
      "year": [
        "Missing data for required field."
      ]
    }
  }
}
+ curl -X POST localhost:5000/api --header 'Content-Type: application/json' --data '{"color": "green", "foobar": 42}'
{
  "errors": {
    "json": {
      "color": [
        "Must be one of: red, blue, yellow."
      ], 
      "email": [
        "Missing data for required field."
      ], 
      "foobar": [
        "Unknown field."
      ], 
      "name": [
        "Missing data for required field."
      ], 
      "year": [
        "Missing data for required field."
      ]
    }
  }
}
+ curl -X POST localhost:5000/api --header 'Content-Type: application/json' --data '{"color": "red", "name": "me", "year": 1950, "email": "me@web.com"}'
{
  "color": "red", 
  "email": "me@web.com", 
  "name": "me", 
  "year": 1950
}

发表评论,因为这并不能具体回答您的问题,但使用可以满足您的大量需求。退房
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class User(db.Model):
    """User."""

    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(50), nullable=False)
    year = db.Column(db.Float(4), nullable=False)
    color = db.Column(db.String(20), nullable=False)

    def to_dict(self):
        """Serialize user to a dict of user info."""

        return {
            "id": self.id,
            "name": self.name,
            "email": self.email,
            "year": self.year,
            "color": self.color,
        }


def connect_db(app):
    """Connect to database."""

    db.app = app
    db.init_app(app)
<!doctype html>
<html>
<head>
  <title>Title</title>
  <script src="https://unpkg.com/jquery"></script>
</head>
<body>

<form id="form" method="POST">
  <div>Name: <input id="name" name="name"> <b id="name-err"></b> </div>
  <div>Birth Year: <input id="year" name="birth_year"> <b id="year-err"></b> </div>
  <div>Email: <input id="email" name="email"> <b id="email-err"></b> </div>
  <div>Color: <input id="color" name="color"> <b id="color-err"></b> </div>
  <button>Submit</button>
</form>



</body>
</html>
+ curl -X POST localhost:5000/api --header 'Content-Type: application/json' --data '{}'
{
  "errors": {
    "json": {
      "color": [
        "Missing data for required field."
      ], 
      "email": [
        "Missing data for required field."
      ], 
      "name": [
        "Missing data for required field."
      ], 
      "year": [
        "Missing data for required field."
      ]
    }
  }
}
+ curl -X POST localhost:5000/api --header 'Content-Type: application/json' --data '{"color": "green", "foobar": 42}'
{
  "errors": {
    "json": {
      "color": [
        "Must be one of: red, blue, yellow."
      ], 
      "email": [
        "Missing data for required field."
      ], 
      "foobar": [
        "Unknown field."
      ], 
      "name": [
        "Missing data for required field."
      ], 
      "year": [
        "Missing data for required field."
      ]
    }
  }
}
+ curl -X POST localhost:5000/api --header 'Content-Type: application/json' --data '{"color": "red", "name": "me", "year": 1950, "email": "me@web.com"}'
{
  "color": "red", 
  "email": "me@web.com", 
  "name": "me", 
  "year": 1950
}