在烧瓶中,我使用以下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响应。有谁知道我如何使用上面的代码段来实现它?
由于
答案 0 :(得分:24)
Flask中的自定义错误响应非常简单。创建一个函数,其唯一参数是HTTP错误状态代码,使其返回flask.Response实例,并使用@app.errorhandler进行修饰。
@app.errorhandler(401)
def custom_401(error):
return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})
然后,您可以将abort(401)
用于内容。
答案 1 :(得分:13)
Flask的abort
直接来自Werkzeug。它是一个可调用对象,可根据需要引发各种预定义的HTTP异常(HTTPException
的子类)。有关详细信息,请查看代码here。
预定义的Unauthorized
(映射到401)仅定义代码和消息,但不定义WWW-Authenticate
标头,如您所知,需要使用浏览器触发登录弹出窗口。 HTTPException
标题已在[('Content-Type', 'text/html')]
中硬编码为HTTPException.get_headers
。
因此,要添加WWW-Authenticate
标头,请创建自己的Unauthorized
子类,覆盖get_headers
函数,最后用它更新abort.mapping
字典。
from flask import abort
from werkzeug.exceptions import Unauthorized
class MyUnauthorized(Unauthorized):
description = '<Why access is denied string goes here...>'
def get_headers(self, environ):
"""Get a list of headers."""
return [('Content-Type', 'text/html'),
('WWW-Authenticate', 'Basic realm="Login required"')]
abort.mapping.update({401: MyUnauthorized})
现在所有abort(401)
次调用都会引发您的自定义异常。