我可以在 restplus 模型旁边显示用户定义的错误消息吗?
Can I have a user-defined error message next to a restplus model?
我编写了一个 Flask
应用程序,提供 API。我正在使用 RESTplus
库。
我使用一个模型来格式化数据。如果请求成功,值将被插入到模型中并且模型被 returned。
但是,如果请求不成功,模型将被 returned 并且所有值都是 null
。我的目标是 return 具有多个键值对的用户定义的错误消息。错误消息的结构应该与模型不同。
这是一个最小的例子:
from flask import Flask
from flask_restplus import Resource, fields, Api
app = Flask(__name__)
api = Api()
api.init_app(app)
books = {'1': {"id": 1, "title": "Learning JavaScript Design Patterns", 'author': "Addy Osmani"},
'2': {"id": 2, "title": "Speaking JavaScript", "author": "Axel Rauschmayer"}}
book_model = api.model('Book', {
'id': fields.String(),
'title': fields.String(),
'author': fields.String(),
})
@api.route('/books/<id>')
class ApiBook(Resource):
@api.marshal_with(book_model)
def get(self, id):
try:
return books[id]
except KeyError as e:
return {'message': 'Id does not exist'}
if __name__ == '__main__':
app.run()
输出成功
curl -X GET "http://127.0.0.1:5000/books/1" -H "accept: application/json"
{
"id": "1",
"title": "Learning JavaScript Design Patterns",
"author": "Addy Osmani"
}
错误输出
curl -X GET "http://127.0.0.1:5000/books/3" -H "accept: application/json"
{
"id": null,
"title": null,
"author": null
}
是否可以在模型旁边显示用户定义的错误消息?有其他选择吗?
不要在get
方法中捕获异常然后return一个对象; return 方法中的任何内容都将使用该模型进行编组。
相反,遵循 error handling documentation 并使用 flask.abort()
设置 404
响应消息:
# at the top of your module
from flask import abort
# in the resource class
@api.marshal_with(book_model)
def get(self, id):
try:
return books[id]
except KeyError as e:
raise abort(404, 'Id does not exist')
你给 abort()
的第二个参数会自动变成一个 JSON 带有 message
键的对象,所以 {"message": "Id does not exist"}
.
您还可以为 KeyError
异常创建一个 @api.errorhandler
注册并将其转换为 404 响应:
@api.errorhandler(KeyError)
def handle_keyerror(error):
return {"message": f"Object with id {error} could not be found"}, 404
然后 不要在你的 get()
方法中捕获异常:
@api.marshal_with(book_model)
def get(self, id):
return books[id]
请注意,当 ERROR_404_HELP
设置为 True
(默认值)时,RestPlus 会将消息添加到备选路线建议中,附加到每个 404 响应中:
curl -X GET "http://127.0.0.1:5000/books/3" -H "accept: application/json"
{
"message": "Object with id '3' could not be found. You have requested this URI [/books/3] but did you mean /books/<id> ?"
}
这对您的具体情况可能没有太大帮助,因此您可能希望禁用 ERROR_404_HELP
。
我编写了一个 Flask
应用程序,提供 API。我正在使用 RESTplus
库。
我使用一个模型来格式化数据。如果请求成功,值将被插入到模型中并且模型被 returned。
但是,如果请求不成功,模型将被 returned 并且所有值都是 null
。我的目标是 return 具有多个键值对的用户定义的错误消息。错误消息的结构应该与模型不同。
这是一个最小的例子:
from flask import Flask
from flask_restplus import Resource, fields, Api
app = Flask(__name__)
api = Api()
api.init_app(app)
books = {'1': {"id": 1, "title": "Learning JavaScript Design Patterns", 'author': "Addy Osmani"},
'2': {"id": 2, "title": "Speaking JavaScript", "author": "Axel Rauschmayer"}}
book_model = api.model('Book', {
'id': fields.String(),
'title': fields.String(),
'author': fields.String(),
})
@api.route('/books/<id>')
class ApiBook(Resource):
@api.marshal_with(book_model)
def get(self, id):
try:
return books[id]
except KeyError as e:
return {'message': 'Id does not exist'}
if __name__ == '__main__':
app.run()
输出成功
curl -X GET "http://127.0.0.1:5000/books/1" -H "accept: application/json"
{
"id": "1",
"title": "Learning JavaScript Design Patterns",
"author": "Addy Osmani"
}
错误输出
curl -X GET "http://127.0.0.1:5000/books/3" -H "accept: application/json"
{
"id": null,
"title": null,
"author": null
}
是否可以在模型旁边显示用户定义的错误消息?有其他选择吗?
不要在get
方法中捕获异常然后return一个对象; return 方法中的任何内容都将使用该模型进行编组。
相反,遵循 error handling documentation 并使用 flask.abort()
设置 404
响应消息:
# at the top of your module
from flask import abort
# in the resource class
@api.marshal_with(book_model)
def get(self, id):
try:
return books[id]
except KeyError as e:
raise abort(404, 'Id does not exist')
你给 abort()
的第二个参数会自动变成一个 JSON 带有 message
键的对象,所以 {"message": "Id does not exist"}
.
您还可以为 KeyError
异常创建一个 @api.errorhandler
注册并将其转换为 404 响应:
@api.errorhandler(KeyError)
def handle_keyerror(error):
return {"message": f"Object with id {error} could not be found"}, 404
然后 不要在你的 get()
方法中捕获异常:
@api.marshal_with(book_model)
def get(self, id):
return books[id]
请注意,当 ERROR_404_HELP
设置为 True
(默认值)时,RestPlus 会将消息添加到备选路线建议中,附加到每个 404 响应中:
curl -X GET "http://127.0.0.1:5000/books/3" -H "accept: application/json"
{
"message": "Object with id '3' could not be found. You have requested this URI [/books/3] but did you mean /books/<id> ?"
}
这对您的具体情况可能没有太大帮助,因此您可能希望禁用 ERROR_404_HELP
。