Diviser L'application Python Flask en plusieurs fichiers

J'ai du mal à comprendre comment diviser une application flask en plusieurs fichiers.

Je crée un service web et je veux diviser l'api en différents fichiers (AccountAPI.py, UploadAPI.py, ...), juste pour que je n'ai pas un énorme fichier python.

J'ai lu que vous pouvez le faire avec des plans, mais je ne suis pas tout à fait sûr que la route est la bonne pour moi.

En fin de compte, je veux exécuter un fichier Python principal et inclure d'autres fichiers de sorte que lorsqu'il s'exécute, ils sont considéré comme un gros fichier.

Par exemple si j'ai Main.py et AccountAPI.py je veux être capable de faire ceci:

Main.py:

from flask import Flask
import AccountAPI

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py:

@app.route("/account")
def accountList():
    return "list of accounts"

Je sais avec cet exemple que cela ne fonctionnera évidemment pas, mais est-il possible de faire quelque chose comme ça?

Merci

56
demandé sur user1751547 2013-03-05 22:29:13

4 réponses

Oui, Les plans sont la bonne façon de le faire. Ce que vous essayez de faire peut être réalisé comme ceci:

Main.py

from flask import Flask
from AccountAPI import account_api

app = Flask(__name__)

app.register_blueprint(account_api)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py

from flask import Blueprint

account_api = Blueprint('account_api', __name__)

@account_api.route("/account")
def accountList():
    return "list of accounts"

Si c'est une option, vous pouvez envisager d'utiliser des préfixes D'URL différents pour les différentes API/Blueprints afin de les séparer proprement. Cela peut être fait avec une légère modification de l'appel register_blueprint ci-dessus:

app.register_blueprint(account_api, url_prefix='/accounts')

Pour plus de documentation, vous pouvez également consulter les documents officiels .

98
répondu cyroxx 2013-03-05 18:59:53

En utilisant Blueprint Vous pouvez ajouter vos routes dans le répertoire routes.

Structure

app.py
routes
    __init__.py
    index.py
    users.py

__init__.py

from flask import Blueprint
routes = Blueprint('routes', __name__)

from .index import *
from .users import *

Index.py

from flask import render_template
from . import routes

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

Users.py

from flask import render_template
from . import routes

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

App.py

from routes import *
app.register_blueprint(routes)

Si vous voulez ajouter un nouveau fichier de route, disons accounts.py, il vous suffit de créer le fichier accounts.py dans le routes répertoire, tout comme index.py et users.py, puis de l'importer dans le routes.__init__.py fichier

from .accounts import *
16
répondu Searene 2016-11-04 01:43:29

Si vous utilisez des blueprints et que vous souhaitez Router / rediriger vers une url de votre blueprint dans un modèle que vous utilisez, vous devez utiliser l'instruction url_for correcte.

Dans votre cas, si vous souhaitez ouvrir l'url du compte de votre plan, vous devez état comme ceci dans votre modèle:

href="{{ url_for('account_api.account') }}"

Et pour l'application principale cela ressemblerait à ceci:

redirect(url_for('account_api.account'))

Sinon la bibliothèque werkzeug lancera une erreur.

3
répondu Thomas Krickl 2015-07-24 13:36:01

Une autre façon de le faire peut être avec chargement paresseux , où vous attacheriez explicitement des fonctions de vue en fonction des besoins.

1
répondu Bhaskar 2013-09-18 12:25:49