我为什么放弃使用leancloud

  • Post author:
  • Post category:IT
  • Post comments:0评论

关注leancloud已经有一段时间了,其宣布的众多开发语言支持,以及SMS, 对象存储, 用户管理及鉴权,推送,聊天等服务对于开发目前主流的移动应用来说,吸引力很大。我们开发的不同移动应用,需要去维护不同的管理后台和服务,开发起来重复而繁琐,如果leancloud能够帮助我们减轻这些工作,那真是物超所值。

为了将应用迁移到leancloud的方案大概如下:

  1. 使用leancloud作为后端存储,用户管理和鉴权引擎;
  2. 使用python开发一个管理界面, 来帮助管理员编辑文章,发布信息;
  3. 使用js, oc作为前端语言来开发用户界面;

在第二步的时候, 我们希望先试验下如下两个简单的user cases:

  1. 创建若干个对象,存储在leancloud中;
  2. 注册一个用户,确定注册结果,并能验证提供的手机和邮箱;

就是这么两个最简单的用例,一整个晚上下来,居然没有搞定。 首先,除了官方文档,leancloud基本很难看到任何其它形式的文档,比如FAQ, 论坛,社区,stackoverflow, 反正google不出来,其次,就是这仅有的官方文档,也是坑爹啊, 以下是我从官方文档上copy的代码片段,几乎未做修改。

# -*- 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.

问题1: SSL InsecurePlatformWarning

在Mac OS和Linux上运行该程序,用户注册失败,并会首先观察到如下的警告:

/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都看不到。

$ pip install pyopenssl ndg-httpsclient pyasn1

问题2: sign_up()报告401错误

解决问题1以后,sign_up()会一直报告401错误(unauthorized), 经过近一个小时的定位,发现该错误由leancloud初始化函数导致,编程指南上的用法如下:

leancloud.init(APP_ID, "%s/%s" % (APP_KEY, MASTER_KEY))

但是参考手册上确是这么写的:

leancloud.client.init(APP_ID, APP_KEY, MASTER_KEY)

两个方式都不会报告语法错,但是前者确好像不能正常工作,查了好久才找到后面的API, 坑爹啊。

问题3: sign_up()允许重复注册

以上测试代码,连续执行两次,居然都成功了,并且在leancloud后台能看到两条相同的用户纪录。sign_up()默认居然可以重复注册?找了好久,发现应用选项中可以配置启用注册用户邮箱验证等选项,勾选了以后,第二次调用sign_up报错。

问题4: sign_up()无法获得失败原因

捕获到sign_up()异常后,本想打印该异常来获得失败原因,结果却导致如下异常:

Traceback (most recent call last):
  File "test1.py", line 23, in <module>
    print e
UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-16: ordinal not in range(128)

问题5: Python sdk没有相关的API来验证注册用户的邮箱或者手机

用户sign_up以后,可以看到leancloud应用后台的_user表中会有该用户信息,同时还有验证邮箱的链接,但是我如果在自己的python后台中提供这个功能呢?百事不得其解。

问题6: 官方文档的语法错误

以下是leancloud Python SDK编程指南的例程, 可以看出第五行应该是game_score.save()而不是game.save()

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')

至此,我基本决定放弃了,因为不知道再往下走还有什么坑,显然解决这些问题的时间已经远远超过我实现这两个基本用例的时间。总结一下原因吧:

  1. 没有真正从用户角度去考虑API设计(问题3,5);
  2. 文档非常少,并且文档已经过期 (问题2);
  3. bug多 (问题4, 6);

发表评论