web-dev-qa-db-fra.com

Fractionner Python Flask app en plusieurs fichiers

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

Je crée un service Web et je souhaite diviser les API en différents fichiers (AccountAPI.py, UploadAPI.py, ...), juste pour ne pas en avoir un énorme python fichier.

J'ai lu que vous pouvez le faire avec Blueprints, mais je ne suis pas entièrement sûr que l'itinéraire soit le bon pour moi.

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

Par exemple, si j'ai Main.py et AccountAPI.py, je veux pouvoir faire ceci:

Main.py:

from flask import Flask
import AccountAPI

app = Flask(__name__)

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

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

AccountAPI.py:

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

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

Merci

71
user1751547

Oui, les plans directeurs 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 __== "__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 différents préfixes d'URL pour les différentes API/Blueprints afin de les séparer proprement. Cela peut être fait avec une légère modification de ce qui précède register_blueprint appel:

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

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

128
cyroxx

En utilisant Blueprint, vous pouvez ajouter vos itinéraires 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 souhaitez ajouter un nouveau fichier d'itinéraire, dites accounts.py, il vous suffit de créer le fichier accounts.py dans le répertoire routes, tout comme index.py et users.py, puis importez-le dans le routes.__init__.py fichier

from .accounts import *
29
Searene

Si vous utilisez des plans et souhaitez acheminer/rediriger vers une URL de votre plan à l'intérieur d'un modèle que vous utilisez, vous devez utiliser la bonne instruction url_for.

Dans votre cas, si vous souhaitez ouvrir le compte URL de votre modèle, vous devez l'indiquer comme ceci dans votre modèle:

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

et pour le principal app cela ressemblerait à ceci:

redirect(url_for('account_api.account'))

Sinon, la bibliothèque werkzeug générera une erreur.

3
Thomas Krickl

Une autre façon de le faire peut être avec chargement paresseux , où vous attacheriez explicitement des fonctions d'affichage selon les besoins.

1
Bhaskar