在python2中不工作,python2与python3继承wrapp

2024-05-19 10:52:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个基于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()

Python2与Python3之比较

问题是,它只在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中实现这个功能??你知道吗


Tags: 实例self服务器tokenauthaccessinitrequest
1条回答
网友
1楼 · 发布于 2024-05-19 10:52:34

找到了解决方案,但需要解释:

为了让它在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会有不同的处理方式,那就太好了。你知道吗

相关问题 更多 >

    热门问题