Wie organisiere ich eine relativ große Kolbenanwendung?

74

Ich baue meine erste Flask-App und kann keine gute, saubere Pythonic-Methode zum Organisieren meiner Anwendung finden. Ich möchte nicht alles in einer einzigen .py-Datei haben, wie in ihrem Beispiel. Ich möchte jeden Teil meiner App in einem separaten Modul haben. Was wäre ein guter Weg, um Dinge zu organisieren?

Daniels
quelle
4
Ich mag das hier erläuterte Layout sehr: flask.pocoo.org/docs/patterns/packages
obmarg
1
Dort verwenden sie zirkuläre Importe, die ich vermeiden möchte.
Daniels
Stimmt, aber ich denke nicht, dass es vermeidbar ist, wenn Sie den app.route-Dekorator verwenden möchten.
Obmarg

Antworten:

82

Ich habe ein Flask Boilerplate-Projekt namens " Fbone " erstellt, bitte zögern Sie nicht, es auszuprobieren und zu teilen :)

Fbone (Flask Bone) ist eine Flask (Python Microframework) Template / Bootstrap / Boilerplate-Anwendung.

Überblick

  • Gut konzipiert für große Projekte mit Blaupause.
  • Integration in das heißeste Frontend-Framework: jQuery / html5boilerplate / bootstrap.
  • Unterstützt von der berühmten SQLalchemy.
  • Implementiere kniffliges "Remember Me" per Flask-Login.
  • Behandeln Sie Webformulare mit flask-wtform.
  • Unit Testing mit Kolbentest und Nase.
  • Einfache Bereitstellung über Fabric und mod_wsgi (Beispiel enthalten).
  • i18n von flask-babel

Übrigens fand ich dieses Wiki gerade beim Erstellen eines großen Projekts mit Flask nützlich. Bitte überprüfen Sie es!

imwilsonxu
quelle
Wirklich so. Vielen Dank!
jdsantiagojr
Bevor Sie 'fab d' ausführen, wie in der README-Datei beschrieben, müssen Sie Ihre virtuelle Umgebung mit 'source env / bin / enabled'
JRG
1
Foundation wird besser sein als Bootstrap, oder?
Rrrub
1
@imwilsonxu Ich konnte nicht sagen, wo Sie mehrere Modelle setzen. Fügen Sie Modelle in verschiedene Dateien ein, wie es ein PHP-Framework tut?
Johnny
(fbone) MacBook-Pro-de-Pyderman: Kolben-Boilerplate Pyderman $fab setup Warning: Command(s) not found: setup
Pyderman
20

Flask 0.7 implementiert Blueprints . Sie eignen sich hervorragend für die Verwendung des routeDekorators, ohne das Hauptanwendungsobjekt zu importieren.

Alex Morega
quelle
1
Wie unterscheidet sich eine Blaupause von einem Modul?
dcolish
1
Technisch gesehen ist ein Blueprint eine Instanz der Blueprint-Klasse. Sie können ein oder mehrere Module umfassen, oder mehrere Blaupausen können gleichzeitig im selben Modul vorhanden sein. Hinter den Kulissen steckt etwas Magie, um das Modul oder Paket eines Bauplans herauszufinden templatesund seine staticOrdner zu finden .
Alex Morega
1
Ich habe Blaupausen in mein Kolbenknochenprojekt integriert, siehe meine Antwort.
Imwilsonxu
17

Lesen Sie unbedingt Matt Wrights wunderbaren Beitrag zu diesem Thema.

Der Beitrag enthält:

  1. Eine Beschreibung einer Struktur für große Kolbenprojekte

  2. Eine Beispielanwendung auf Github

  3. Eine Beschreibung der besten Entwurfspraktiken im Allgemeinen bei großen Webanwendungen wie MVC-Muster, App-Fabriken, Services und Datenmigration, um nur einige zu nennen (meiner Meinung nach interessanteste Funktion).

edsioufi
quelle
Eine gute Erklärung mit Beispielen.
Nandesh
12

Ich arbeite an einem (nach meinen Maßstäben) großen Flask-Projekt (5000 Zeilen Python-Code und es ist nur halb fertig). Der Kunde möchte, dass das Projekt modular aufgebaut ist, daher habe ich diesen Ansatz gewählt:

Meine Ordnerstruktur sieht folgendermaßen aus:

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

In modules.ymldefiniere ich meine Module einschließlich Name und URL. Auf diese Weise kann der Kunde Module aktivieren / deaktivieren, ohne eine einzelne Python-Datei zu berühren. Außerdem generiere ich die Menüs basierend auf der Modulliste. Vereinbarungsgemäß jedes Modul hat sein eigenes Python-Modul in controllers/dem seiner Last wird modelaus models/. Jeder Controller definiert einen Blueprintals Controller gespeicherten Namen. ZB für ein userModul habe ich in controllers/user.py:

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

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

Auf diese Weise kann ich das modules.ymlin my lesen __init__.pyund alle aktivierten Module dynamisch laden und registrieren:

# 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'])

Ich hoffe, das kann eine Inspiration für dich sein :)

msiemens
quelle
Wo legen Sie Ihre Testdateien ab?
Alp
1
Die oben beschriebene Struktur ist eigentlich ein Unterverzeichnis mit dem Projektnamen ( project_name/). Es gibt auch einen tests/Ordner und einen scripts/Ordner (für ausführbare Skripte). Denn tests/es wäre klug, die gleiche Struktur wie in der Antwort zu verwenden: tests/models/Für Modelltests, tests/controllers/für Controllertests nennen Sie es. Dies würde einen gewissen Aufwand für die Aufrechterhaltung der Struktur erfordern, würde es jedoch sehr einfach machen, die benötigten Dateien zu finden.
Msiemens
5

Ich habe in einem sozialen Netzwerk gearbeitet, das auf Flask aufgebaut ist. Das Besondere an meinem Projekt war, dass der Server nur API-Endpunkte bedient und das Frontend eine einseitige Backbone-App ist. Die Kolbenstruktur, die ich genommen habe, ist die folgende:

├── 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 │ └── ...

Den ausführlicheren Beitrag, den ich zu diesem Thema geschrieben habe, können Sie hier lesen . Ich fand es viel intuitiver, verschiedene Funktionsbereiche in einen eigenen Ordner zu unterteilen.

Ich habe vor einiger Zeit an dem Code gearbeitet und ihn komplett mit Open Source bezogen! Sie können es auf Github überprüfen .

spchuang
quelle
Vielen Dank. Sieht gut aus.
Daniels
2

Ich habe einen Flask App Yapper von Grund auf neu erstellt und ihn für die Frontend- und Backend-Entwicklung in gulp integriert. Es ist eine einfache Blog-Engine, die jedoch leicht an die Anforderungen angepasst werden kann. Es ist mit Blueprints gut strukturiert.

Kasse der Projektseite yapper

brijeshb42
quelle