Come dividere l'app di pallone in più file PY?


146

La mia applicazione di pallone è attualmente composta da un singolo test.py file con più percorsi e il main()percorso definito. C'è un modo per creare un test2.pyfile che contenga percorsi che non sono stati gestiti test.py?

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

Sono preoccupato che ci siano troppi percorsi test.pye vorrei renderlo tale che io possa correre python test.py, il che raccoglierà i percorsi test.pycome se facessero parte dello stesso file. Quali cambiamenti devo apportaretest.py e / o includere test2.pyper farlo funzionare?

Risposte:


153

Puoi usare la solita struttura del pacchetto Python per dividere la tua app in più moduli, vedi i documenti di Flask.

Però,

Flask utilizza un concetto di progetti per creare componenti di applicazioni e supportare modelli comuni all'interno di un'applicazione o tra più applicazioni.

Puoi creare un sottocomponente dell'app come modello in un file separato:

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

E poi usalo nella parte principale:

from yourapplication.simple_page import simple_page

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

I progetti possono anche raggruppare risorse specifiche: modelli o file statici. Fare riferimento ai documenti di Flask per tutti i dettagli.


1
come possiamo avere le rotte del blueprint nel file diverso da quello init di quel blueprint?
divyenduz,

se voglio fare un end point sicuro usando JWT, come lo farò in ogni file route.py
Ashok Sri

19

Puoi usare un semplice trucco che è importare la variabile dell'app flask dall'interno di un altro file, come:

test-routes.py

from __main__ import app

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

e nei tuoi file principali, dove hai dichiarato l'app di pallone, importa i percorsi di prova, come:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

Funziona dalla mia parte.


2
È solo un esempio, si __main__riferisce al file di entrata, tutto qui!
nimeresam,

3
Fantastico, molte grazie. Il modello o l'approccio del pacchetto sopra riportato sono sovraccarichi per le piccole app.
VH-NZZ,

Ecco un link ai documenti in cui viene spiegato questo metodo: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Christopher

1
@nimeresam Ha funzionato per me, ma ho dovuto imparare che import test-routesnon può essere all'inizio del app.pyfile. Si è schiantato in gunicorn ma dopo aver spostato l'importazione in fondo al file ha funzionato. "solo assicurando che il modulo sia importato e lo stiamo facendo in fondo al file"
Niklas R.


5

Dividere l'app in progetti è un'ottima idea. Tuttavia, se ciò non è sufficiente e se si desidera quindi dividere il Blueprint stesso in più file PY, ciò è anche possibile utilizzando il normale sistema di importazione del modulo Python e quindi scorrere in sequenza tutte le rotte che vengono importate dagli altri file .

Ho creato un Gist con il codice per fare questo:

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

Per quanto ne so, questo è l'unico modo possibile per dividere un progetto al momento. Non è possibile creare "progetti secondari" in Flask, anche se c'è un problema aperto con molte discussioni al riguardo:

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

Inoltre, anche se fosse possibile (ed è probabilmente fattibile utilizzando alcuni degli snippet di quel thread di emissione), i sottoprogrammi potrebbero essere troppo restrittivi per il tuo caso d'uso, ad esempio se non vuoi tutti i percorsi in un sotto-modulo per avere lo stesso sotto-prefisso URL.


4

Questa attività può essere eseguita senza progetti e importazioni complicate utilizzando la Mappa URL centralizzata

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')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.