Flask中间件中断401导致500

2024-09-30 01:21:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Flask应用程序中有一个中间件,用于验证请求头中的JSON Web令牌,并正在检查以验证它,下面是我的中间件类:

class AuthMiddleware(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        path = environ.get('PATH_INFO')
        if path != '/authenticate' or path != '/token':
            token = environ.get('HTTP_X_ACCESS_TOKEN')
            verfied_token = verify_token(token)
            if verfied_token is False:
                abort(401)
            elif verfied_token is True:
                # payload = get_token_payload(token)
                # check_permissions(payload)
                pass

        return self.app(environ, start_response) 

verify_token()是一个返回True或False的函数,如果它返回False,我希望它以错误401中止。但是,它会因错误500而中止:

^{pr2}$

在我看来,我应该取消401计划,但现在看来这是个问题。我该怎么办?在


Tags: 中间件pathselftokenfalseappgetif
1条回答
网友
1楼 · 发布于 2024-09-30 01:21:05

您展示的中间件运行一些其他代码,然后调用包装好的Flask应用程序。但是,abort引发了Flask处理的异常,但WSGI不直接处理这些异常。因为您还不在Flask应用程序中,所以它无法处理异常。在

一个更简单的方法是在烧瓶应用程序中进行检查。创建一个before_request处理程序,它与中间件基本相同,只是可以使用flask.request,而不需要自己解析路径和头。在

from flask import request, abort

@app.before_request
def check_auth_token():
    if request.path in ('/authenticate', '/token'):
        return

    token = request.headers.get('X-ACCESS-TOKEN')

    if not verify_token(token):
        abort(401)

    check_permissions(get_token_payload(token))

如果您想使用WSGI中间件来实现这一点,您需要自己创建响应。方便地说,Werkzeug的异常行为类似于WSGI应用程序,因此使用它们很简单。在

^{pr2}$

您还可以使用abort,方法是捕捉它引发的异常(这也是WSGI应用程序)。在

from werkzeug.exceptions import abort, HTTPException
# werkzeug.exceptions.abort is the same as flask.abort

try:
    abort(401)
except HTTPException as e:
    return e(environ, start_response)

相关问题 更多 >

    热门问题