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
相关产品推荐
相关产品推荐

