Google App Engine中GetAccessToken报错:token.expires_in为NoneType
嘿,我之前在维护Python 2.7的GAE项目时也碰到过一模一样的问题!这种NoneType和整数运算的错误,本质上是授权返回的token里expires_in字段没正确获取到,导致后续计算过期时间时炸了。给你几个实际可行的排查和解决方向:
先确认授权请求的完整性
先在调用GetAccessToken之后,手动打印返回的token对象,看看里面的字段是不是齐全的。比如加一行print(token),检查有没有expires_in这个键,或者它的值是不是真的为None。有时候是因为请求的scopes不正确、服务账号密钥配置有误,或者网络问题导致token返回不完整,这时候得先把请求层面的问题搞定。给
expires_in加个默认值兜底
考虑到Python 2.7的库对空值的容错性不如新版本,你可以在计算过期时间的时候主动处理None的情况。比如把原来的运算代码改成:now = int(time.time()) expires_at = now + (token.expires_in if token.expires_in is not None else 3600)3600秒是Google默认的token有效期,用这个值兜底至少能让程序先跑起来,后续再排查为什么
expires_in会是None。锁定兼容Python 2.7的SDK版本
虽然你说SDK已经更新,但要注意:Google很多官方库从2.0版本开始就不再支持Python 2.7了。比如google-auth库,2.0+完全放弃了2.7支持,如果你装了最新版,很可能会出现这种奇怪的兼容性问题。建议降级到明确支持2.7的版本,比如:pip install google-auth==1.35.0 pip install google-api-python-client==1.12.1这两个版本都是经过验证能在Python 2.7的GAE环境下正常工作的。
检查App Engine环境的依赖配置
如果是在GAE标准环境,确保app.yaml里的runtime设置为python27,并且requirements.txt里只列出兼容2.7的库版本,避免不同版本的依赖冲突。比如不要同时装google-auth的1.x和2.x版本,否则会出现奇怪的导入问题。
内容的提问来源于stack exchange,提问作者Josh Jackson

