AWS Chalice: маршруты в нескольких файлах Python

Я запускаю AWS Lambda и влюбился в Чашу. Из того, что я понимаю, он имеет ту же идею Flask, но использует все запросы "без сервера". Я хотел бы собрать сложную структуру с несколькими файлами лямбда-скриптов. Я не нахожу такого примера.

В заметке об обновлении здесь говорится, что с версии 0.4 было добавлено то, что, похоже, именно то, что я ищу. И в этом примере показано, как извлечь данные из файлов в папке "chalicelib".

Следуя этой логике, можно создать несколько папок внутри "chalicelib", как если бы каждая папка представляла собой модуль моего приложения, а внутри папок каждый файл представлял бы собой маршрут с отрезком исходного кода?


Интересно, это жизнеспособное решение:

app/
├── requirements.txt
├── app.py
└── chalicelib
    ├── __init__.py
    ├── users
    │   ├── __init__.py
    │   ├── route.py
    │   └── controller.py
    └── teams
        ├── __init__.py
        ├── parameters.py
        └── controller.py

app.py:

import chalicelib

chalicelib> __init__.py:

from . import users, teams

chalicelib> пользователи> __init__.py:

from . import route

chalicelib> пользователи> route.py:

from app import app
from . import controller

@app.route("/users/test")
def test():
    return controller.test()

1 ответ

У Чаши есть особенность, называемая чертежами. Эти чертежи Чаши концептуально похожи на чертежи в термосе. Схемы используются для организации вашего приложения в логические компоненты. Используя схему, вы определяете свои ресурсы и декораторы в модулях за пределами вашего app.py. Затем вы регистрируете план в своем основном файле app.py. Чертежи поддерживают любой декоратор, доступный для объекта приложения. Используя чертежи, вы можете определять свои маршруты в нескольких файлах.

Из Chalice 1.12.0 вам нужно вызвать импорт в app.py следующим образом:

from chalice import Chalice
from chalicelib.users.controller import createUser

app = Chalice(app_name='MyApp')

@app.route('/users', content_types=['application/json'], methods=['POST'], api_key_required=True, cors=True)
def userPost():
    data = app.current_request.json_body
    response = createUser(data)
    return response

В другом вашем файле в chalicelib/users/controller.py:

def createUser(userData):
    ...{logic here}...
    return response

Вам нужно импортировать переменные в каждый файл инициализации, пока не дойдете до нужного файла. Например:

app/
|__ app.py
|__ config.py
|__ app
   |__ mod_cad
      |__ controllers.py
      |__ models.py
   |__ mod_home
      |__ controllers.py
   |__ static
      |__ ...
   |__ templates
      |__ ...
   |__ __init__.py

Затем:

__init__.py:

def index():
    return render_template("home.html")

@app.errorhandler(404)
def not_found(error):
    return render_template('404.html'), 404

from app.mod_cad.controllers import mod_cad as cad_module
from app.mod_home.controllers import mod_home as home_module

app.register_blueprint(cad_module)
app.register_blueprint(home_module)

db.create_all()

А также:

app.py:

# Run a test server.
from app import app
app.run(host='localhost', port=8080, debug=True)
Другие вопросы по тегам