Python 如何使用Flask SQL Alchemy在JSON中显示表单中的约束错误?
现在,我的项目接受表单中的用户信息,并以JSON格式作为POST请求返回信息。创建的用户也会保存到数据库中。这正是我想要做的,但是如果用户输入的信息不满足其约束,我希望结束路由列出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"
{
"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”“”##########################
标题
姓名:
出生年份:
电邮:
颜色:
提交
您可以查看以下库:
从烧瓶导入烧瓶,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
}