Як організувати порівняно великий додаток Flask?


74

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


4
Мені дуже подобається макет, пояснений тут: flask.pocoo.org/docs/patterns/packages
obmarg

1
Там вони використовують циркулярний імпорт, якого я хотів би уникнути.
daniels

Правда, але я не думаю, що цього можна уникнути, якщо ви хочете використовувати декоратор app.route.
обмарг

Відповіді:


83

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

Fbone (Flask bone) - це програма / завантажувальний шаблон / шаблонний шаблон Flask (мікрофреймворк Python).

Огляд

  • Добре розроблений для великого проекту з використанням проекту.
  • Інтегруйте з найгарячішим фронтенд-фреймворком: jQuery / html5boilerplate / bootstrap.
  • Підкріплений знаменитою SQL-алхімією.
  • Реалізуйте хитромудре "запам'ятати мене" за допомогою flask-login.
  • Обробляйте веб-форми за допомогою flask-wtform.
  • Блокове випробування за допомогою колби та носової проби.
  • Легко розгортати через fabric та mod_wsgi (доданий приклад).
  • i18n від flask-babel

До речі, я щойно знайшов цю вікі для створення великого проекту з Flask корисним, будь ласка, перевірте!


Дійсно так. Дякую!
jdsantiagojr

Перш ніж запустити "fab d", як описано в README, вам потрібно активувати своє віртуальне середовище за допомогою "source env / bin / activate"
JRG

1
Фундамент буде кращим за бутстрап, так?
rrrub

1
@imwilsonxu Я не міг сказати, куди ви поставили кілька моделей. Ви вкладаєте моделі в різні файли, як це робить php framework?
johnny

(fbone) MacBook-Pro-de-Pyderman: flask-зразок Pyderman $fab setup Warning: Command(s) not found: setup
Pyderman

20

Flask 0.7 реалізує креслення . Вони чудово підходять для використання routeдекоратора без імпорту основного об’єкта програми.


1
Чим проект відрізняється від модуля?
dcolish

1
Технічно проект є екземпляром класу Blueprint. Вони можуть охоплювати один або кілька модулів, або кілька проектів можуть співіснувати в одному модулі. Існує деяка магія за кадром, щоб з’ясувати модуль або пакет проекту, знайти його templatesта staticпапки.
Алекс Морега

1
Я інтегрував креслення у свій проект з кістки колби, див. Мою відповідь.
imwilsonxu

17

Обов’язково прочитайте чудовий пост Метта Райта на цю тему.

Особливості публікації:

  1. Опис конструкції для великих колбових проектів

  2. Приклад програми на Github

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


Чудове пояснення на прикладах.
Нандеш,

12

Я працюю над (за моїми стандартами) великим проектом 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'])

Сподіваюсь, це може бути для вас натхненням :)


куди ви кладете свої тестові файли?
Alp

1
Описана вище структура насправді є підкаталогом з назвою проекту ( project_name/). Також є tests/папка та scripts/папка (для виконуваних сценаріїв). Бо tests/розумно було б використовувати ту саму структуру, що і у відповіді: tests/models/для тестів моделей, tests/controllers/для тестів контролерів ви називаєте це. Це вимагає певних накладних витрат на підтримку структури, але дуже легко буде знайти потрібні файли.
msiemens

5

Я працював у соціальній мережі, побудованій поверх Flask. Особливість мого проекту полягала в тому, що сервер суто обслуговує кінцеві точки API, а інтерфейс - це односторінкова програма 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 .


Дякую. Виглядає добре.
daniels

2

Я створив програму Flask yapper з нуля та інтегрував його з ковтком як для інтерфейсу, так і для розробки. Це простий движок блогу, але його можна легко модифікувати для розробки відповідно до вимог. Він добре структурований за допомогою креслень.

Оформити сторінку проекту yapper

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.