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.