_unicodify_header_value(self.environ['HTTP_' + key]) 给出 KeyError: 'HTTP_TOKEN'

meh*_*ati 5 python api client werkzeug flask

request.headers['token']
Run Code Online (Sandbox Code Playgroud)

我在烧瓶中得到这样的令牌值。但这会返回一个关键错误,如下所示:

api       |     return _unicodify_header_value(self.environ['HTTP_' + key])
api       | KeyError: 'HTTP_TOKEN'
Run Code Online (Sandbox Code Playgroud)

上面的部分来自 werkzueg 的 datastructs.py。客户端:

...
        retries = Retry(total=total,
                        backoff_factor=backoff_factor,
                        status_forcelist=[429, 500, 502, 503, 504])
        http = requests.Session()
        http.mount("https://",
                   TimeoutHTTPAdapter(max_retries=retries, timeout=timeout))
        http.mount("http://",
                   TimeoutHTTPAdapter(max_retries=retries, timeout=timeout))
        self.http = http
...
...
    def add_regular_user_request(self,
                                 user_name=None,
                                 password=None,
                                 email=None):
        endpoint = "/api/regularuser"
        api_url_complete = self.api_url + endpoint
        params = {}
        if user_name is None or password is None or email is None:
            raise IncompleteParams
        params['user_name'] = user_name
        params['password'] = password
        params['email'] = email
        result = self.http.post(api_url_complete,
                                data=params,
                                headers=self.headers)
...
...
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?任何其他细节请告诉我。

小智 0

首先,检查并确认您确实将 jwt 授权令牌传递到您的 Flask 应用程序。在 Chrome 开发工具之类的工具中,检查您的前端代码请求以确认您确实传递了授权令牌。或者使用邮递员为您要测试的特定 Flask 蓝图路由手动设置所有身份验证令牌标头。

其次,确认您不会在路由开始处理请求之前尝试过早访问 jwt 令牌。换句话说,您是否有任何@application.before_request处理程序试图拦截或处理 jwt 令牌?这些处理程序应该位于您在最顶层描述 Flask 应用程序的任何位置(启动 Flask 应用程序的东西)。

就我而言,我的错误/用例是在路由处理过程中过早尝试访问 jwt 身份验证令牌的结果。您的原因可能与我的用例不同,但重大变化可能仍然相同。@application.before_request尝试从执行 get_jwt_identity 之类的代码的处理程序部分中注释掉:

@application.before_request
def before_request_handler():
    g.session_id = uuid4()
    g.user_id = get_jwt_identity() #TODO: comment out this entire line
Run Code Online (Sandbox Code Playgroud)

如果不了解更多关于更大的应用程序上下文的信息,我无法提供具体的解决方案,但这绝对是导致我的问题的原因。我在路由设置 jwt 令牌之前访问 jwt 令牌Authorization。就我而言,我不需要Authorizationjwt 令牌来成功将 user_id 设置为全局会话变量,并且路由处理程序稍后能够成功设置授权令牌,因此从技术上讲,这里没有任何损坏,除了烦人的虚假错误消息。

更新:确认将我的get_jwt_identity()函数调用移出before_request处理程序并降低到存储库类型服务中解决了我的错误。我不再看到那个错误。