【问题标题】:Not working in Python 2, Python 2 vs Python 3 Inheriting a wrapper不能在 Python 2 中工作,Python 2 与 Python 3 继承包装器
【发布时间】:2016-01-09 09:04:52
【问题描述】:

我正在开发一个基于 Flask 的 OAuth 项目,该项目具有 OAuthSignIn 类的单个实例。这个类对于我支持的每个 OAuth 客户端 Facebook、Twitter 和 Google 都有三个子类。服务器上只有一个实例,它们都包含一个名为 oauth_session 的对象,用于对适当的 OAuth 端点进行端点调用。为确保这些调用代表当前用户,在调用之前,我必须将oauth_session 对象的access_token 变量编辑为当前用户的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 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 inheritance oauth flask wrapper


    【解决方案1】:

    想出了解决办法,但需要解释:

    要让它在 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 之间会有不同的处理方式,那就太好了。

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多