Comment diviser l'application Flask en plusieurs fichiers py?

146

Mon application flask se compose actuellement d'un seul test.pyfichier avec plusieurs itinéraires et l' main()itinéraire défini. Est-il possible de créer un test2.pyfichier contenant des itinéraires non gérés test.py?

@app.route('/somepath')
def somehandler():
    # Handler code here

Je crains qu'il y ait trop de routes test.pyet je voudrais faire en sorte que je puisse courir python test.py, ce qui reprendra également les routes test.pycomme si elles faisaient partie du même fichier. Quels changements dois-je apporter test.pyet / ou inclure test2.pypour que cela fonctionne?

Rolando
la source

Réponses:

153

Vous pouvez utiliser la structure de package Python habituelle pour diviser votre application en plusieurs modules, voir la documentation Flask.

cependant,

Flask utilise un concept de plans pour créer des composants d'application et prendre en charge des modèles communs au sein d'une application ou entre les applications.

Vous pouvez créer un sous-composant de votre application en tant que Blueprint dans un fichier séparé:

simple_page = Blueprint('simple_page', __name__, template_folder='templates')
@simple_page.route('/<page>')
def show(page):
    # stuff

Et puis utilisez-le dans la partie principale:

from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)

Les Blueprints peuvent également regrouper des ressources spécifiques: des modèles ou des fichiers statiques. Veuillez consulter la documentation Flask pour tous les détails.

pixelistik
la source
1
comment pouvons-nous avoir les routes du plan directeur dans un fichier autre que l' init de ce plan?
divyenduz
si je veux créer des points de terminaison sécurisés à l'aide de JWT, comment le faire dans tous les fichiers route.py
Ashok Sri
19

Vous pouvez utiliser une astuce simple qui consiste à importer la variable d'application flask de main dans un autre fichier, comme:

test-routes.py

from __main__ import app

@app.route('/test', methods=['GET'])
def test():
    return 'it works!'

et dans vos fichiers principaux, où vous avez déclaré l'application flask, importez des routes de test, comme:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

Cela fonctionne de mon côté.

nimésame
la source
2
C'est juste un exemple, __main__fait référence à votre fichier d'entrée, c'est tout!
nimeresam le
3
Génial, merci beaucoup. Blueprint ou l'approche de package ci-dessus sont des surpuissants pour les petites applications.
VH-NZZ
Voici un lien vers la documentation où cette méthode est expliquée: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Christopher
1
@nimeresam Cela a fonctionné pour moi mais j'ai dû apprendre que le import test-routesne peut pas être en haut du app.pyfichier. Il s'est écrasé gunicorn mais après avoir déplacé l'importation vers le bas du fichier, cela a fonctionné. "il suffit de s'assurer que le module est importé et nous le faisons au bas du fichier"
Niklas R. il y a
5

Diviser l'application en plans est une excellente idée. Cependant, si cela ne suffit pas et si vous souhaitez ensuite diviser le Blueprint lui-même en plusieurs fichiers py, cela est également possible en utilisant le système d'importation de module Python normal, puis en parcourant toutes les routes importées à partir des autres fichiers. .

J'ai créé un Gist avec le code pour faire ceci:

https://gist.github.com/Jaza/61f879f577bc9d06029e

Pour autant que je sache, c'est la seule façon faisable de diviser un plan pour le moment. Il n'est pas possible de créer des "sous-plans" dans Flask, bien qu'il y ait un problème ouvert avec beaucoup de discussions à ce sujet:

https://github.com/mitsuhiko/flask/issues/593

De plus, même si c'était possible (et c'est probablement faisable en utilisant certains des extraits de ce fil de discussion), les sous-plans peuvent être trop restrictifs pour votre cas d'utilisation de toute façon - par exemple, si vous ne voulez pas que toutes les routes dans un sous-module pour avoir le même sous-préfixe d'URL.

Jaza
la source
4

Cette tâche peut être accomplie sans plans et importations délicates à l'aide de la mappe d'URL centralisée

app.py

import views
from flask import Flask

app = Flask(__name__)

app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)

if __name__ == '__main__':
    app.run(debug=True, use_reloader=True)

views.py

from flask import render_template

def index():
    return render_template('index.html')

def other():
    return render_template('other.html')
Bleiz
la source