关注 leancloud 已经有一段时间了,其宣布的众多开发语言支持,以及SMS, 对象存储, 用户管理及鉴权,推送,聊天等服务对于开发目前主流的移动应用来说,吸引力很大。我们开发的不同移动应用,需要去维护不同的管理后台和服务,开发起来重复而繁琐,如果leancloud能够帮助我们减轻这些工作,那真是物超所值。
为了将应用迁移到leancloud的方案大概如下:
在第二步的时候, 我们希望先试验下如下两个简单的user cases:
就是这么两个最简单的用例,一整个晚上下来,居然没有搞定。 首先,除了官方文档,leancloud基本很难看到任何其它形式的文档,比如FAQ, 论坛,社区,stackoverflow, 反正google不出来,其次,就是这仅有的官方文档,也是坑爹啊, 以下是我从官方文档上copy的代码片段,几乎未做修改。
Default
# -*- coding: utf-8 -*- #coding=utf-8 import leancloud APP_ID='temv66wvy83zurm3710wt9kir41zaza5gfu0gkhzzcf4a1yv' APP_KEY='00zuyjgtcvjs31qy7ysktd43fevoblt4e4yx2yjf8gt46q8d' MASTER_KEY='82irmrurzr9ib2axiputuh6ul8b9zozs7qbcfpchf0t2ts80' leancloud.init(APP_ID, "%s/%s" % (APP_KEY, MASTER_KEY)) user = leancloud.User() user.set("username", "admin") user.set("password", "admin") user.set("email", "admin@whhe.com") # other fields can be set just like with leancloud.Object user.set("phone", "415-392-0202") try: user.sign_up() except Exception, e: print e # Hooray! Let them use the app now.
在Mac OS和Linux上运行该程序,用户注册失败,并会首先观察到如下的警告:
Default
/usr/lib/python2.7/site-packages/requests-2.6.0-py2.7.egg/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning
不过一番查找后发现这好像是urllib3的一个通用问题,可以按照如下方法来解决。但是如此通用的问题,居然连一个FAQ都看不到。
Default
$ pip install pyopenssl ndg-httpsclient pyasn1
解决问题1以后,sign_up()会一直报告401错误(unauthorized), 经过近一个小时的定位,发现该错误由leancloud初始化函数导致, 编程指南 上的用法如下:
Default
leancloud.init(APP_ID, "%s/%s" % (APP_KEY, MASTER_KEY))
但是 参考手册 上确是这么写的:
Default
leancloud.client.init(APP_ID, APP_KEY, MASTER_KEY)
两个方式都不会报告语法错,但是前者确好像不能正常工作,查了好久才找到后面的API, 坑爹啊。
以上测试代码,连续执行两次,居然都成功了,并且在leancloud后台能看到两条相同的用户纪录。sign_up()默认居然可以重复注册?找了好久,发现应用选项中可以配置启用注册用户邮箱验证等选项,勾选了以后,第二次调用sign_up报错。
捕获到sign_up()异常后,本想打印该异常来获得失败原因,结果却导致如下异常:
Default
Traceback (most recent call last): File "test1.py", line 23, inprint e UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-16: ordinal not in range(128)
用户sign_up以后,可以看到leancloud应用后台的_user表中会有该用户信息,同时还有验证邮箱的链接,但是我如果在自己的python后台中提供这个功能呢?百事不得其解。
以下是 leancloud Python SDK编程指南 的例程, 可以看出第五行应该是game_score.save()而不是game.save()
Default
game_score = GameScore() game_score.set('score', 42) # or game_score.score = 42 game_score.set('cheatMode', False) game_score.set('playerName', 'Marvin') game.save() # 还可以通过关键字参数,在创建对象的同时进行赋值 game_score = GameScore(score=42, playerName='Marvin')
至此,我基本决定放弃了,因为不知道再往下走还有什么坑,显然解决这些问题的时间已经远远超过我实现这两个基本用例的时间。总结一下原因吧: