文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
API 友好的错误消息
你是否还记得,在本章的前部分,当我要求你用一个无效的用户 URL 从浏览器发送一个 API 请求时发生了什么?服务器返回了 404 错误,但是这个错误被格式化为标准的 404 HTML 错误页面。在 API blueprint 中的 API 可能返回的许多错误可以被重写为 JSON 版本,但是仍然有一些错误是由 Flask 处理的,处理这些错误的处理函数是被全局注册到应用中的,返回的是 HTML。
HTTP 协议支持一种机制,通过该机制,客户机和服务器可以就响应的最佳格式达成一致,称为 内容协商 。客户端需要发送一个 Accept
头部,指示格式首选项。然后,服务器查看自身格式列表并使用匹配客户端格式列表中的最佳格式进行响应。
我想做的是修改全局应用的错误处理器,使它们能够根据客户端的格式首选项对返回内容是使用 HTML 还是 JSON 进行内容协商。这可以通过使用 Flask 的 request.accept_mimetypes
来完成:
app/errors/handlers.py :为错误响应进行内容协商。
from flask import render_template, request
from app import db
from app.errors import bp
from app.api.errors import error_response as api_error_response
def wants_json_response():
return request.accept_mimetypes['application/json'] >= \
request.accept_mimetypes['text/html']
@bp.app_errorhandler(404)
def not_found_error(error):
if wants_json_response():
return api_error_response(404)
return render_template('errors/404.html'), 404
@bp.app_errorhandler(500)
def internal_error(error):
db.session.rollback()
if wants_json_response():
return api_error_response(500)
return render_template('errors/500.html'), 500
wants_json_response()
辅助函数比较客户端对 JSON 和 HTML 格式的偏好程度。 如果 JSON 比 HTML 高,那么我会返回一个 JSON 响应。 否则,我会返回原始的基于模板的 HTML 响应。 对于 JSON 响应,我将使用从 API blueprint 中导入 error_response
辅助函数,但在这里我要将其重命名为 api_error_response()
,以便清楚它的作用和来历。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论