【问题标题】:Python3 Flask - missing 1 required positional argument: 'self'Python3 Flask - 缺少 1 个必需的位置参数:'self'
【发布时间】:2014-11-29 16:15:52
【问题描述】:

我有非常简单的 python 代码来访问 Amazon Simple Queue Service。但我明白了

   builtins.TypeError
TypeError: get_queue() missing 1 required positional argument: 'self'

我的代码:

class CloudQueue(object):

    conn = boto.sqs.connect_to_region("eu-west-1",
        aws_access_key_id="abc",
        aws_secret_access_key="abc")


    @app.route('/get/<name>')  
    def get_queue(self, name):

        if(name != None):
            queue = self.conn.get_queue(str(name)) <--------- HERE
        return conn.get_all_queues()


if __name__ == "__main__":
    cq = CloudQueue()
    app.debug = True
    app.run()

【问题讨论】:

  • 确实,self 没有定义;您的方法根本没有参数。在任何情况下都不能在类上注册方法,因为在使用装饰器注册方法时,该方法并未绑定到实例。
  • 当我将 self 添加到 def get_queue(self,name) 时,我得到 builtins.TypeError TypeError: get_queue() missing 1 required positional argument: 'self'
  • @user2988649:没错,这就是我所说的你不能注册方法。装饰器在创建类对象之前运行 那里然后,因此您只注册函数,而不是绑定到实例的方法。

标签: python python-3.x flask


【解决方案1】:

您不能将方法注册为路由;在装饰器运行时,该类仍在定义中,您注册的只是未绑定的函数对象。因为它没有绑定到实例,所以没有self 可以传入。

这里不要使用类;为每个请求重新创建连接:

@app.route('/get/<name>')  
def get_queue(name):
    conn = boto.sqs.connect_to_region("eu-west-1",
        aws_access_key_id="abc",
        aws_secret_access_key="abc")

    queue = conn.get_queue(name)
    return 'some response string'

您可以将其设置为全局,但您需要确保在第一个请求时重新创建连接(因此即使使用 WSGI 服务器使用子进程处理请求,它也能继续工作):

@app.before_first_request()
def connect_to_boto():
    global conn
    conn = boto.sqs.connect_to_region("eu-west-1",
        aws_access_key_id="abc",
        aws_secret_access_key="abc")

@app.route('/get/<name>')  
def get_queue(name):
    queue = conn.get_queue(name)
    return 'some response string'

仅当您确定boto 连接对象是线程安全的时才使用此选项。

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 2023-02-06
    • 2021-09-15
    • 2013-07-06
    • 2022-01-05
    • 2017-03-28
    • 2020-01-07
    • 2019-09-26
    相关资源
    最近更新 更多