不适用于 Python 2,Python 2 与 Python 3 继承包装器
Not working in Python 2, Python 2 vs Python 3 Inheriting a wrapper
我正在开发一个基于 Flask 的 OAuth 项目,该项目有一个 OAuthSignIn
class 实例。对于我支持的每个 OAuth 客户端,Facebook、Twitter 和 Google,这个 class 有三个子 classes。服务器上每个实例只有一个实例,它们都包含一个名为 oauth_session
的对象,用于对适当的 OAuth 端点进行端点调用。为确保这些调用代表当前用户,在调用之前,我必须将 oauth_session
对象的 access_token
变量编辑为当前用户的 session['access_token']
。我想通过在 super class (OAuthObject) 中找到的包装器来做到这一点。
以下是我在服务器上所做工作的一个非常基本的模型,仅显示它的继承和其他。我制作了一个包装器来编辑子 class 的 oauth_session.access_token
并将其放入 OAuthObect
的超级 class 中,所以我只需要写一次。
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 2 对比 Python 3
这个有问题,它只在 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)
如何在 Python 2 中完成这项工作??
找到解决方案但需要解释:
为了让它在 Python 2 中工作,我所要做的就是将包装函数修改为如下所示:
@classmethod
def auth_request(self, f):
@wraps(f)
def wrapper(self):
self.oauth_session.access_token = session['access_token']
return f(self)
return wrapper
必须将其设为 @classmethod
,然后将 self
作为第一个参数添加到 auth_request
声明中。不知道为什么,如果有人想解释为什么在 Python 的两个版本之间会有不同的处理方式,那就太好了。
我正在开发一个基于 Flask 的 OAuth 项目,该项目有一个 OAuthSignIn
class 实例。对于我支持的每个 OAuth 客户端,Facebook、Twitter 和 Google,这个 class 有三个子 classes。服务器上每个实例只有一个实例,它们都包含一个名为 oauth_session
的对象,用于对适当的 OAuth 端点进行端点调用。为确保这些调用代表当前用户,在调用之前,我必须将 oauth_session
对象的 access_token
变量编辑为当前用户的 session['access_token']
。我想通过在 super class (OAuthObject) 中找到的包装器来做到这一点。
以下是我在服务器上所做工作的一个非常基本的模型,仅显示它的继承和其他。我制作了一个包装器来编辑子 class 的 oauth_session.access_token
并将其放入 OAuthObect
的超级 class 中,所以我只需要写一次。
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 2 对比 Python 3
这个有问题,它只在 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)
如何在 Python 2 中完成这项工作??
找到解决方案但需要解释:
为了让它在 Python 2 中工作,我所要做的就是将包装函数修改为如下所示:
@classmethod
def auth_request(self, f):
@wraps(f)
def wrapper(self):
self.oauth_session.access_token = session['access_token']
return f(self)
return wrapper
必须将其设为 @classmethod
,然后将 self
作为第一个参数添加到 auth_request
声明中。不知道为什么,如果有人想解释为什么在 Python 的两个版本之间会有不同的处理方式,那就太好了。