好的我正在编写一种与Grooveshark(http://grooveshark.com)接口的方法。现在我有一个类Grooveshark和几个方法,一个获取与服务器的会话,另一个获取基于会话的令牌,另一个用于构建对服务器的api调用(和其他方法使用它)。现在我像这样使用它....注意使用twisted和t.i.defer扭曲
g = Grooveshark()
d = g.get_session()
d.addCallback(lambda x: g.get_token())
## and then something like.... ##
g.search("Song")
即使在初始化类之后,我发现这种非语言和丑陋的感觉,你必须首先调用两个方法,否则其他方法将无效。为了解决这个问题,我试图获得它,以便创建api调用的方法负责会话和令牌。目前这两个方法(会话和令牌方法)设置类变量并且不返回任何内容(很好)。所以我的问题是,在与需要令牌和会话的网站连接时是否使用了通用设计?此外,从服务器检索令牌和会话,因此我无法在 init 方法中运行它们(因为它会阻止或者在进行api调用之前可能无法完成)
答案 0 :(得分:3)
我发现这种无声和丑陋的感觉 甚至在初级化你之后 必须首先调用两个方法,否则 其他方法不起作用。
如果是,那么为什么不将get_session
部分放在班级__init__
中呢?如果它总是必须在其他任何事情之前执行,那似乎是有道理的。当然,这意味着调用类将仍然返回一个尚未使用的实例 - 这对于异步,事件驱动编程是不可避免的......你不会“阻塞直到实例是准备启用”。
一种可能性是在调用它时传递回调作为类的参数执行;一个更为Twisted-normal的将是Grooveshark
是一个返回延迟的函数(你将添加到延迟的回调执行,并在该实例最终准备好时将实例作为参数调用它)待用)。
答案 1 :(得分:0)
我强烈建议您查看Facebook graph API。仅仅因为您需要会话和一些身份验证并不意味着您可以构建一个干净的REST API。 Facebook使用OAuth来处理身份验证,但还有其他可能性。