Django返回Twilio JWT令牌触发bytes无法JSON序列化错误
问题原因
核心触发点是Twilio依赖版本变动:新版Twilio库的AccessToken.to_jwt()方法返回值为bytes类型,旧版本返回的是str字符串。Django内置的JsonResponse基于Python标准json模块实现,原生不支持bytes类型的序列化,因此抛出类型错误。之前功能正常是因为环境中安装的是旧版Twilio,大概率是依赖自动更新导致返回值类型变化,和业务代码本身逻辑无关。
另外原代码中return JsonResponse(json.dumps(full_data), content_type="application/json", safe=False)属于错误用法:JsonResponse本身会自动完成字典到JSON字符串的序列化,提前调用json.dumps()会导致重复序列化,即使token类型正确,返回结果也会出现多余的转义符。
修复方法
- 将
to_jwt()返回的bytes对象按UTF-8编码解码为字符串,JWT本身为文本格式,解码不会改变内容有效性。 - 移除冗余的
json.dumps()调用,直接将构造好的字典传入JsonResponse即可。
修复后的完整视图代码:
class TokenView(View): def get(self, request, username, *args, **kwargs): voice_grant = grants.VoiceGrant( outgoing_application_sid=settings.TWIML_APPLICATION_SID, incoming_allow=True, ) access_token = AccessToken( settings.TWILIO_ACCOUNT_SID, settings.TWILIO_API_KEY, settings.TWILIO_API_SECRET, identity=username ) access_token.add_grant(voice_grant) # 新增decode操作,将bytes转为可序列化的字符串 jwt_token = access_token.to_jwt().decode("utf-8") full_data = {"token": jwt_token} return JsonResponse(full_data)
如果需要验证类型,可以放开代码中注释的print(type(jwt_token))语句,输出为<class 'str'>即符合序列化要求。
内容的提问来源于stack exchange,提问作者Emm
相关产品推荐
相关产品推荐

