Dividi l'app Python Flask in più file


91

Ho problemi a capire come dividere un'app Flask in più file.

Sto creando un servizio web e voglio dividere le API in diversi file (AccountAPI.py, UploadAPI.py, ...), solo così non ho un enorme file Python.

Ho letto che puoi farlo con Blueprints, ma non sono del tutto sicuro che il percorso sia quello giusto per me.

In definitiva, voglio eseguire un file Main python e includere altri file in modo che quando viene eseguito, siano considerati un unico file di grandi dimensioni.

Ad esempio, se ho Main.py e AccountAPI.py voglio essere in grado di farlo:

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"

So che con questo esempio ovviamente non funzionerà, ma è possibile fare qualcosa del genere?

Grazie

Risposte:


163

Sì, i progetti sono il modo giusto per farlo. Quello che stai cercando di fare può essere ottenuto in questo modo:

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"

Se questa è un'opzione, potresti prendere in considerazione l'utilizzo di prefissi URL diversi per le diverse API / blueprint al fine di separarli in modo pulito. Questo può essere fatto con una leggera modifica alla register_blueprintchiamata precedente :

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

Per ulteriore documentazione, puoi anche dare un'occhiata ai documenti ufficiali .


Questo ha funzionato perfettamente per me grazie! Immagino che avrei dovuto leggere i documenti di Blueprint con più attenzione.
user1751547

Ehi, ho una domanda. Nel codice sopra riportato, l'URL per accountList () corrisponde a "dominio / account / account"?
jeyraof

4
Main.py e AccountAPI.py possono avere una variabile globale condivisa che si trova in uno dei file?
matchifang

Esiste una soluzione semplice per inserire accountListuna classe nello stesso file?
GA1

Ha funzionato come un incantesimo, inoltre come aggiungere un punto finale protetto utilizzando JWT in file .py separati
Ashok Sri

41

Usando Blueprintpuoi aggiungere i tuoi percorsi nel fileroutes directory.

Struttura

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)

Se vuoi aggiungere un nuovo file di rotta, ad esempio accounts.py, devi solo creare il file accounts.pynella routesdirectory, proprio come index.pye users.py, quindi importarlo nel routes.__init__.pyfile

from .accounts import *

1
Sta
generando

L'importazione nel mezzo del file può essere considerata una cattiva pratica?
TomSawyer

3

Se stai usando blueprint e vuoi instradare / reindirizzare a un URL del tuo progetto all'interno di un template che stai usando, devi usare l'istruzione url_for corretta.

Nel tuo caso, se desideri aprire l'URL dell'account del tuo progetto, devi dichiararlo in questo modo nel tuo modello :

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

e per l' app principale sarebbe simile a questo:

redirect(url_for('account_api.account'))

Altrimenti la libreria werkzeug genererà un errore.


1

Un altro modo per farlo può essere con il caricamento lento , in cui allegare esplicitamente le funzioni di visualizzazione in base alle necessità.

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.