【问题标题】:_unicodify_header_value(self.environ['HTTP_' + key]) gives KeyError: 'HTTP_TOKEN'_unicodify_header_value(self.environ['HTTP_' + key]) 给出 KeyError: 'HTTP_TOKEN'
【发布时间】:2020-10-06 20:56:41
【问题描述】:
request.headers['token']

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

api       |     return _unicodify_header_value(self.environ['HTTP_' + key])
api       | KeyError: 'HTTP_TOKEN'

以上部分来自 werkzueg 的 datastructures.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)
...
...

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

【问题讨论】:

  • Hey Mehant:你找到解决办法了吗?
  • 找到解决方案了吗..?

标签: python api flask client werkzeug


【解决方案1】:

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

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

就我而言,我的错误/用例是在路由处理过程中过早尝试访问 jwt auth 令牌的结果。您的原因可能与我的用例不同,但重大更改可能仍然相同。尝试从您的 @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

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

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

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2022-01-26
    相关资源
    最近更新 更多