Как организовать относительно большое приложение Flask?

Я создаю свое первое приложение Flask, и я не могу понять хороший, чистый Pythonic способ организации моего приложения. Я не хочу иметь все в одном файле .py, как в их примере. Я хотел бы иметь каждую часть моего приложения в отдельном модуле. Что было бы хорошим способом организовать вещи?

Ответ 1

Я создал проект шаблона Flask под названием " Fbone", пожалуйста, не забудьте проверить его и вилку:)

Fbone (фляжная кость) - это шаблон флекса (микрофонная диаграмма Python)/загрузочное/шаблонное приложение.

Обзор

  • Хорошо разработан для большого проекта с использованием плана.
  • Интеграция с самой горячей инфраструктурой frontend: jQuery/html5boilerplate/bootstrap.
  • Опираясь на знаменитую SQLalchemy.
  • Реализуйте сложную "помните меня" с помощью флажка-входа.
  • Обрабатывать веб-формы с помощью flask-wtform.
  • Тестирование с помощью фляжки и носа.
  • Простое развертывание через ткань и mod_wsgi (пример включен).
  • i18n by flask-babel

btw, я просто нашел этот wiki для создания большого проекта с помощью Flask, PLS, проверьте его!

Ответ 2

Flask 0.7 реализует Blueprints. Они отлично подходят для использования декоратора route без импорта основного объекта приложения.

Ответ 3

Обязательно прочитайте Мэтт Райт замечательный пост по этому вопросу. p >

Особенности сообщения:

  • Описание структуры для проектов с большими колбами

  • Пример приложения в Github

  • Описание лучших методов проектирования в целом, когда речь идет о крупных веб-приложениях, таких как шаблон MVC, фабрики приложений, службы и миграция данных, чтобы назвать несколько (наиболее интересная функция IMHO).

Ответ 4

Я работаю над (по моим меркам) большим проектом Flask (5000 строк кода Python и он только наполовину готов). Заказчик хочет, чтобы проект был модульным, поэтому я принял это выражение:

Моя структура папок выглядит следующим образом:

├── __init__.py
├── modules.yml
├── config
├── controllers
│   └── ...
├── lib: Common functions I use often
│   └── ...
├── models
│   └── ...
├── static: All static files
│   ├── css
│   ├── img
│   └── js
└── templates: Jinja2 templates
    └── ...

В modules.yml я определяю свои модули, включая имя и URL. Таким образом, клиент может включать/отключать модули, не касаясь одного файла Python. Кроме того, я создаю меню на основе списка модулей. По соглашению каждый модуль имеет свой собственный Python-модуль в controllers/, который загрузит его model из models/. Каждый контроллер определяет Blueprint, сохраненный как имя контроллера. Например. для модуля user у меня есть controllers/user.py:

# Module name is 'user', thus save Blueprint as 'user' variable
user = Blueprint('user', __name__)

@user.route('/user/')
def index():
    pass

Таким образом, я могу читать modules.yml в моем __init__.py и загружать и регистрировать все включенные модули динамически:

# Import modules
for module in modules:

    # Get module name from 'url' setting, exculde leading slash
    modname = module['url'][1:]

    try:
        # from project.controllers.<modname> import <modname>
        mod = __import__(
            'project.controllers.' + modname, None, None, modname
        )
    except Exception as e:
        # Log exceptions here
        # [...]

    mod = getattr(mod, modname)  # Get blueprint from module
    app.register_blueprint(mod, url_prefix=module['url'])

Надеюсь, это может быть для вас источником вдохновения:)

Ответ 5

Я работал в социальной сети, построенной поверх Flask. Особенность моего проекта заключалась в том, что сервер исключительно обслуживает конечные точки API, а frontend - одностраничное приложение Backbone. Конструкция фляги, которую я взял, такова:

├── app │ ├── api
│ │ ├── auth.py │ │ └── ... │ ├── app.py │ ├── common │ │ ├── constants.py │ │ ├── helpers.py │ │ ├── response.py │ │ └── ... │ ├── config.py │ ├── extensions.py │ ├── frontend │ │ └── controllers.py │ ├── static │ │ └── ... │ ├── templates │ │ ├── app.html │ │ └── ... │ └── users │ ├── UserConstants.py │ ├── UserForms.py │ ├── UserHelpers.py │ ├── UserModels.py │ └── __init__.py ├── alembic | ├── version │ └── ... ├── tests │ └── ...

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

Я работал над кодом некоторое время назад и открыл его полностью! Вы можете проверить это на github.

Ответ 6

Я создал приложение Flask yapper с нуля и интегрировал его с gulp для разработки интерфейса и бэкэнд. Это простой блог-движок, но его можно легко модифицировать для разработки в соответствии с требованиями. Он хорошо структурирован с использованием чертежей.

Оформить страницу проекта yapper