2014-11-29 2 views
-1

У меня очень простой код на Python для доступа к простой службе очереди Amazon. Но я получаюPython3 Flask - отсутствует 1 обязательный позиционный аргумент: 'self'

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() 
+0

И действительно, 'self' не определен; ваш метод не имеет параметра вообще. Вы не можете зарегистрировать метод в классе в любом случае, потому что метод не привязан к экземпляру, когда вы регистрируете его с помощью декоратора. –

+0

я получаю builtins.TypeError TypeError: get_queue() недостающий 1 необходимый позиционную аргумент: «я» , когда я добавить себя в DEF get_queue (самоощущение, имя) – user2988649

+0

@ user2988649: точно, это то, что я имел в виду * Вы не можете зарегистрироваться метод*. Декоратор запускается * тут же * перед созданием объекта класса, поэтому вы регистрируете только функцию, а не метод, связанный с экземпляром. –

ответ

0

Вы не можете зарегистрировать методы, как маршруты; в то время, когда декоратор запускает класс, все еще определяется, и все, что вы зарегистрировали, является несвязанным функциональным объектом. Так как он не связан с экземпляром, нет 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 объекты соединения потокобезопасны.

Смежные вопросы