在 Flask 中使用 HTTP 身份验证时的标准 401 响应
在 Flask 中,我使用以下 snippet 来启用 HTTP 身份验证:
def authenticate():
return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})
现在,根据我过去使用 Flask 的经验,如果某人的凭据不正确,我想让他们知道我可以调用:
abort(401)
这将为您提供基本的 apache 401 响应。有谁知道我如何使用上面的代码片段来实现它?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 Flask 中自定义错误响应确实非常简单。创建一个函数,其唯一参数是HTTP错误状态代码,使其返回一个flask.Response实例,并用@app.errorhandler。
然后您可以随心所欲地使用
abort(401)
。Custom error responses are really quite easy in Flask. Create a function whose only argument is the HTTP error status code, make it return a flask.Response instance, and decorate it with @app.errorhandler.
You can then use
abort(401)
to your heart's content.Flask 的
abort
直接来自 Werkzeug。它是一个可调用对象,可根据需要引发各种预定义的 HTTP 异常(HTTPException
的子类)。请查看此处的代码了解详细信息。预定义的
Unauthorized
(映射到 401)仅定义代码和消息,但不定义WWW-Authenticate
标头,正如您所知,触发登录需要该标头- 浏览器弹出。HTTPException
具有的标头在HTTPException.get_headers
中硬编码为[('Content-Type', 'text/html')]
。因此,要添加
WWW-Authenticate
标头,请创建您自己的Unauthorized
子类,覆盖get_headers
函数,最后更新abort.mapping
字典用它。现在,所有
abort(401)
调用都会引发您的自定义异常。Flask's
abort
comes directly from Werkzeug. It is a callable object, that raises various predefined HTTP exceptions (subclasses ofHTTPException
) on demand. Check out the code here for details.The predefined
Unauthorized
(which is mapped to 401) only defines the code and a message, but not theWWW-Authenticate
header, which as you know is required to trigger the login-popup with browsers. The headers anHTTPException
has are hardcoded as[('Content-Type', 'text/html')]
inHTTPException.get_headers
.So to add the
WWW-Authenticate
header, create your ownUnauthorized
subclass, overwrite theget_headers
function and finally update theabort.mapping
dictionary with it.Now all
abort(401)
calls will raise your custom exception.