我一直在阅读一些使用令牌进行身份验证的示例代码,并且有一条我完全不理解的行。
client.set_signature_method(SignatureMethod_RSA_SHA1())
具体来说,我不确定“SignatureMethod_RSA_SHA1()”的作用。这是SignatureMethod类,供参考:
class SignatureMethod_RSA_SHA1(oauth.SignatureMethod):
name = 'RSA-SHA1'
def signing_base(self, request, consumer, token):
if not hasattr(request, 'normalized_url') or request.normalized_url is None:
raise ValueError("Base URL for request is not set.")
sig = ( #Creates the request?
oauth.escape(request.method),
oauth.escape(request.normalized_url),
oauth.escape(request.get_normalized_parameters()),
)
key = '%s&' % oauth.escape(consumer.secret)#
if token:
key += oauth.escape(token.secret)
raw = '&'.join(sig)
return key, raw
def sign(self, request, consumer, token):
"""Builds the base signature string."""
key, raw = self.signing_base(request, consumer, token)
with open('../rsa.pem', 'r') as f:
data = f.read()
privateKeyString = data.strip()
privatekey = keyfactory.parsePrivateKey(privateKeyString)
signature = privatekey.hashAndSign(raw)
return base64.b64encode(signature)
语法表明该类被称为函数,这是我在短时间编程中从未见过的。这有什么意思吗?
答案 0 :(得分:2)
这就是你实例化一个类的方法,它没有被用作函数(虽然从技术上来说它是调用类Answer
方法)。
__init__()
显然采用某种签名方法类的实例(不确定client.set_signature_method()
是否是唯一可能的类型)并且很可能将其挂在SignatureMethod_RSA_SHA1()
对象上可通过client
或其他一些财产访问。
这与做:
相同client.signature_method
如果您不需要在sig_method = SignatureMethod_RSA_SHA1()
client.set_signature_method(sig_method)
个实例之外再次访问sig_method
,这只是一种较短的方式。
更熟悉的例子是:
client
这样a_list = list()
a_dict = dict()
及其属性和方法现在可供SignatureMethod_RSA_SHA1()
实例使用。更简单的例子我们可以这样做:
client
所以现在该列表可供该类使用,因此它的方法也是如此:
>>> class MyClass:
def __init__(self, my_list):
self.my_list = my_list
def add_to_list(self, a_value):
self.my_list.append(a_value)
>>> foo = MyClass(list())
>>> foo.my_list
[]
更重要的是,类可以像我们的>>> foo.my_list.extend([2,4,1,4,8,0,3,])
>>> foo.my_list
[2, 4, 1, 4, 8, 0, 3]
方法一样在内部使用列表对象方法(这可能是add_to_list()
的使用方式):
SignatureMethod_RSA_SHA1()
答案 1 :(得分:0)
SignatureMethod_RSA_SHA1()
只是类构造函数。它的__init__
函数被调用。
换句话说 - 使用set_signature_method
实例调用SignatureMethod_RSA_SHA1
。