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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:15:34