Flask: чертежи, необходимые для фабрик приложений?

Я хочу иметь несколько фабрик приложений (в настоящее время: один для разработки и еще один для тестирования). Мне интересно, как правильно их реализовать.

В настоящее время я использую объект приложения для регистрации видов (через @app.route() decorator). Нужно ли начинать использовать чертежи (вместо приложения) для регистрации видов? Есть ли способ иметь подходящие фабрики приложений без чертежей?

Ответ 1

технически, вам не нужны чертежи, вы можете просто зарегистрировать каждый маршрут в своей функции create_app. Вообще говоря, это не отличная идея, и это то, почему существуют чертежи.

Пример без чертежей

def create_app():
  app = Flask(__name__)

  @app.route('/')
  def index():
    return render_template('index.html')

  return app

У вас может быть одно приложение factory для тестирования и любого другого, если вы настроите его таким образом. Если вы хотите загружать разные чертежи на основе, если они находятся в процессе тестирования, вы можете сделать что-то вроде этого.

from project.config import configurations as c

def create_app(config=None):
  " make the app "
  app = Flask(__name__)
  app.config.from_object(c.get(config, None) or c['default'])

  configure_blueprints(app)

  return app

def configure_blueprints(app):
  " register the blueprints on your app "
  if app.testing:
    from project.test_bp import bp
    app.register_blueprint(bp)
  else:
    from project.not_test_bp import bp
    app.register_blueprint(bp)

тогда project/config.py может быть следующим:

class DefaultConfig(object):
  PROJECT_NAME = 'my project'

class TestingConfig(DefaultConfig):
  TESTING = True

class DevConfig(DefaultConfig):
  DEBUG = True

configurations = {
  'testing': TestingConfig,
  'dev': DevConfig,
  'default': DefaultConfig
}

Создайте папку для каждого проекта, где __init__.py в папке создает проект. Скажем, для чертежа routes

from flask import Blueprint

bp = Blueprint('routes', __name__)

from project.routes import views

то в project/routes/views.py вы можете поместить свои представления.

from project.routes import bp

@bp.route('/')
def index():
  return render_template('routes/index.html')

Ответ 2

У вас наверняка может быть приложение factory без чертежа, но это часто не имеет смысла.

Предполагая, что у вас есть пакет приложений с именем myapp. Вот ваш __init__.py:

from flask import Flask

def create_app():
    app = Flask(__name__)

    return app

Теперь мы создаем новый .py файл с именем autoapp.py (или wsgi.py или manage.py и т.д.) вне пакета myapp. В autoapp.py вы создаете экземпляр приложения и импортируете представления из myapp:

from myapp import create_app

app = create_app()

from myapp import views

Оператор импорта свяжет app с вашими маршрутами. Вы можете импортировать app в свой views.py следующим образом:

from autoapp import app

@app.route('/')
def index():
    return 'Hello!'

Структура приложения:

myapp/
    myapp/
        __init__.py
        views.py
    autoapp.py

Ответ 3

Для тех, кто гуглил этот вопрос. Вам не нужно использовать чертежи. Просто импортируйте current_app как приложение в ваши маршруты. (Или views.py, что угодно), и вы можете свободно идти.

from flask import current_app as app

Кроме того, вы должны добавить это к фабрике (функция create_app), чтобы зарегистрировать ваши маршруты:

with app.app_context():
    from . import routes