【问题标题】:JWT is being converted from str to bytes on requests.post()JWT 在 requests.post() 上从 str 转换为 bytes
【发布时间】:2017-08-14 07:38:24
【问题描述】:

我正在编写一个 Flask 应用程序,其中我有一个服务,它生成一个 JWT,并在将其解码为“UTF-8”后使用 requests.post() 将其传递给另一个服务。

在发送 JWT 时,我可以看到类型是“str”。但是,在其他服务上执行 json.loads() 时,我收到一条错误提示

TypeError:JSON 对象必须是 str,而不是 'bytes'

这是我的代码:

服务 1:

@app.route('/')
def index():
   token = jwt.encode({'message': 'Hello'}, app.config['SECRET_KEY'])
   # After this statement I am able to verify the type is str and not bytes
   token = token.decode('UTF-8')
   headers = {'content-type': 'application/json'}
   url = 'someUrl'
   data = {"token": token}
   data = json.dumps(data)
   requests.post(url, data=data, headers=headers)
   return 'Success'

服务 2:

@app.route('/', methods=['POST'])
def index():
   data = json.loads(request.data)
   return 'Success'

为什么即使类型转换为字符串,我也会收到此错误?

编辑:我能够通过标头传递令牌成功检索令牌。但我还是想知道是什么导致了这个错误。

【问题讨论】:

  • 尝试删除token = token.decode('UTF-8')
  • 这给了我一个“不可序列化的 JSON 类型错误”。需要在json.dumps之前解码为'UTF-8'
  • 将data = json.loads(request.data) 更改为data = request.get_json() 可能是一种可能的解决方法。

标签: json python-3.x flask python-requests jwt


【解决方案1】:

您可以将其发布为 JSON 而不是数据,并让底层库为您处理。

服务 1

@app.route('/')
def index():
   token = jwt.encode({'message': 'Hello'}, app.config['SECRET_KEY']).decode('UTF-8')
   url = 'someUrl'
   data = {"token": token}
   requests.post(url, json=data)
   return 'Success'

服务 2

    data = request.get_json()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 2018-12-26
    • 2014-08-03
    • 2019-10-31
    • 1970-01-01
    • 2016-01-13
    • 2022-07-26
    • 1970-01-01
    相关资源
    最近更新 更多