【发布时间】:2015-07-04 00:02:43
【问题描述】:
我偶然发现了 python 3,特别是 tornado 框架。
我的任务是集成 facebook 身份验证,我从这里使用了测试用例:
https://github.com/tornadoweb/tornado/tree/master/demos/facebook
所以重点是user 是一个包含字节数据的字典。
class AuthLoginHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
@tornado.web.asynchronous
def get(self):
....
def _on_auth(self, user):
if not user:
raise tornado.web.HTTPError(500, "Facebook auth failed")
self.set_secure_cookie("fbdemo_user", tornado.escape.json_encode(user))
self.redirect(self.get_argument("next", "/"))
_on_auth 总是产生这个错误:b'token or sesion_expire data here' is not JSON serializable
我在 stackoverflow 上发现了几个孤子:
Fix编码前的数据
import collections.abc
def convert(data):
'''
Converts bytes data into unicode strings, so this can be encoded into JSON
'''
if isinstance(data, str):
return str(data)
elif isinstance(data, bytes):
return data.decode('utf-8')
elif isinstance(data, collections.abc.Mapping):
return dict(map(convert, data.items()))
elif isinstance(data, collections.abc.Iterable):
return type(data)(map(convert, data))
else:
return data
# ... and somewhere in the code
tornado.escape.json_encode(convert(user))
接下来就是扩展json本身了:
import json
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, bytes):
return o.decode('utf-8')
return json.JSONEncoder.default(self, o)
现在的问题是:为什么像type(data) == <class 'bytes'> 这样的数据会有这样的问题,我做得对吗?
谢谢
【问题讨论】:
-
问题是
user不是字典,它是字节字符串b'token or sesion_expire data here'确实不是 JSON 可序列化的。我建议在调试器中运行您的代码以找出它来自哪里。
标签: json facebook python-3.x tornado