在烧瓶中使用HTTP auth时的标准401响应

时间:2011-10-24 14:32:08

标签: python apache2 flask http-authentication abort

在烧瓶中,我使用以下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响应。有谁知道我如何使用上面的代码段来实现它?

由于

2 个答案:

答案 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)次调用都会引发您的自定义异常。