Вернуть объект ответа из chalicelib/utils.py

Используя AWS Chalice, и предположим, app.py выглядит так:

from chalice import Chalice, Response
from chalicelib.utils import some_class

app = Chalice(app_name='myApp')
app.debug = True

@app.route('/myRoute',
       methods=['POST'],
       content_types=['application/octet-stream'])
def myRoute():
   some_class_instance = some_class()
   some_class_instance.some_def()

   return Response(
      body={'hello': 'world'},
      headers={'Content-Type': 'application/json'})

И в utils.py:

import requests
from chalice import Response

class some_class:
    def some_def():
        return Response(
             body={'key1': 'val1'},
             headers={'Content-Type': 'application/json'})

Заявление о возврате от some_class.some_def не возвращается клиенту, если написано, как показано. Но если я бегу some_def изнутри app.py это возвращается. Зачем?

Как я могу вернуть объекты клиенту извне app.py?

3 ответа

Решение

Ответ тривиально прост (подсказка коллеги). Вы оцениваете возвращаемое значение из some_def в функции звонилки (myRoute). Если он не пуст, вы возвращаете его. Используя пример из вопроса, app.py выглядит так:

from chalice import Chalice, Response
from chalicelib.utils import some_class

app = Chalice(app_name='myApp')
app.debug = True

@app.route('/myRoute',
           methods=['POST'],
           content_types=['application/octet-stream'])
def myRoute():
    some_class_instance = some_class()
    r = some_class_instance.some_def()
    if r:
        return r
    else:
        return Response(
               body={'hello': 'world'},
               headers={'Content-Type': 'application/json'})

Если вы не хотите хранить код приложения в app.py это решение для multifile служба поддержки.

Вы можете создать каталог chalicelib/, и все, что в этом каталоге, будет рекурсивно включено в пакет развертывания.

├── app.py
├── chalicelib
│   └── __init__.py
|   └── utils.py
└── requirements.txt

И тогда в вашем app.py импорт, как это

from chalicelib.utils import SomeClass

some_class = SomeClass()
some_class.some_def()

Я не вижу, чтобы вы вызывали some_class.some_def в utils.py. Вам нужно вызвать функцию, как вы это сделали в app.py:

some_class.some_def()
Другие вопросы по тегам