You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda Python3.7发REST POST请求报str拼接bytes错误咨询

Python 3.7 环境下Lambda构造POST鉴权头报错的修复方案

报错根因

这类TypeError: can't concat str to bytes的核心诱因是Python 2和Python 3的字符串类型机制差异:

  • Python 2.7中字符串和字节串无严格类型边界,带b前缀的写法仅为向后兼容标识,两类内容可隐式拼接,因此原有代码可正常运行
  • Python 3中bytes(字节串)和str(普通字符串)是完全独立的类型,强校验不允许直接拼接

你代码中的触发点为:
b"token:" + TOKEN
此处b"token:"是bytes类型,而TOKEN是默认的str类型,直接拼接就会触发类型错误。
另外需额外注意:Python 3版本的requests库要求所有请求头的键、值必须为str类型,即便拼接不报错,直接把bytes类型的内容放到Header字典中,也会在请求阶段触发其他类型不兼容错误。

修复实现

按照Python 3的类型规则调整鉴权头的构造逻辑:

  • 将参与base64编码的所有内容统一转为bytes类型,通过.encode("utf-8")将字符串值转为字节
  • 将base64编码得到的bytes结果,通过.decode("utf-8")转回普通str类型,作为鉴权头的值

修正后可直接运行的代码示例:

import base64
import requests

DOMAIN = 'xxx-yyy.com'
TOKEN = 'xdfbvgsded5e9fb99a'
JOB = 1

def lambda_handler(event, context):
    build_url = f'https://{DOMAIN}/api/2.0/jobs/run-now'
    # 构造兼容Python3的鉴权头
    auth_raw = b"token:" + TOKEN.encode("utf-8")
    auth_b64 = base64.standard_b64encode(auth_raw).decode("utf-8")
    headers = {"Authorization": f"Basic {auth_b64}"}

    response = requests.post(
        build_url,
        headers=headers,
        json={"job_id": JOB}
    )

    if response.status_code == 200:
        print("Request Submitted")
    else:
        print(f"Error launching cluster, status code: {response.status_code}")

常见避坑点

  • 不要在Python 3的requests请求中,向headers字典传入bytes类型的键或值,必须全部转换为str格式
  • 做base64编解码操作时,明确区分输入输出的类型:编码函数入参要求bytes,编码输出也是bytes,当结果需要作为HTTP请求参数/请求头时,必须转回str类型

内容的提问来源于stack exchange,提问作者user3646519

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 02:24:04