Python3 Flask - 缺少一个必需的位置参数:'self'

5
我有一个非常简单的 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未定义;您的方法根本没有该参数。无论如何,您都无法在类上注册方法,因为当您使用装饰器注册它时,该方法未绑定到实例。 - Martijn Pieters
当我在 def get_queue(self,name) 中添加 self 后,出现了builtins.TypeError TypeError: get_queue() missing 1 required positional argument: 'self' - user2988649
@user2988649:确切地说,这就是我所说的“您无法注册方法”的意思。装饰器在创建类对象之前立即运行,因此您仅注册了函数,而不是绑定到实例的方法。 - Martijn Pieters
1个回答

7

您不能将方法注册为路由;在装饰器运行时,类仍在定义中,并且您注册的只是未绑定的函数对象。由于它没有绑定到实例,因此没有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连接对象是线程安全的情况下使用此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接