我正在处理一个基于Flask的OAuth项目,它有一个OAuthSignIn
类的实例。对于我支持的每个OAuth客户机,这个类有三个子类:Facebook、Twitter和Google。服务器上只有一个实例,它们都包含一个名为oauth_session
的对象,用于对相应的OAuth端点进行端点调用。为了确保这些调用代表当前用户,在进行调用之前,必须将access_token
对象的oauth_session
变量编辑为当前用户的session['access_token']
。我想通过在超类(OAuthObject)中找到的包装器来实现这一点。你知道吗
下面是我在服务器上所做工作的一个非常基本的模型,只是展示了它的继承性,而不是什么。我制作了一个包装器来编辑子类的oauth_session.access_token
,并将其放入了OAuthObect
的超类中,所以我只需要编写一次。你知道吗
from functools import wraps
class OAuthSessionObject():
def __init__(self):
self.access_token = "r424jt3g"
class OAuthObject():
def __init__(self):
pass
def auth_request(f):
@wraps(f)
def wrapper(self):
self.oauth_session.access_token = 444
#self.oauth_session.access_token = session['access_token']
return f(self)
return wrapper
class GoogleObject(OAuthObject):
def __init__(self):
self.oauth_session = OAuthSessionObject()
@OAuthObject.auth_request
def make_request(self):
print("Making a request with updated access_token:", self.oauth_session.access_token)
google = GoogleObject()
google.make_request()
问题是,它只在Python 3中works,我目前正在heroku上运行Python 2服务器,在本地,我得到以下错误:
@OAuthSignIn.auth_request
TypeError: unbound method auth_request() must be called with OAuthSignIn instance as first argument (got function instance instead)
如何在python2中实现这个功能??你知道吗
找到了解决方案,但需要解释:
为了让它在Python 2中工作,我所要做的就是修改包装器函数,使其看起来像这样:
必须将其设为
@classmethod
,并将self
作为第一个参数添加到auth_request
声明中。但不知道为什么,如果有人想解释为什么这两个版本的Python会有不同的处理方式,那就太好了。你知道吗相关问题 更多 >
编程相关推荐