Jak podzielić aplikację flask na wiele plików py?

146

Moja aplikacja flask składa się obecnie z jednego test.pypliku z wieloma trasami i main()zdefiniowaną trasą. Czy istnieje sposób na utworzenie test2.pypliku zawierającego trasy, które nie były obsługiwane test.py?

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

Obawiam się, że jest zbyt wiele tras test.pyi chciałbym, aby było tak, żebym mógł biegać python test.py, co również będzie odbierać trasy test.pytak, jakby były częścią tego samego pliku. Jakie zmiany muszę wprowadzić test.pyi / lub uwzględnić, test2.pyaby to zadziałało?

Rolando
źródło

Odpowiedzi:

152

Możesz użyć zwykłej struktury pakietów Pythona, aby podzielić swoją aplikację na wiele modułów, zobacz dokumentację Flask.

Jednak,

Flask wykorzystuje koncepcję schematów do tworzenia komponentów aplikacji i obsługi typowych wzorców w aplikacji lub między aplikacjami.

Możesz utworzyć podkomponent swojej aplikacji jako Blueprint w oddzielnym pliku:

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

A potem użyj go w głównej części:

from yourapplication.simple_page import simple_page

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

Plany mogą również zawierać określone zasoby: szablony lub pliki statyczne. Szczegółowe informacje można znaleźć w dokumentacji Flask .

pixelistik
źródło
1
jak możemy mieć plany tras w pliku innym niż init tego planu?
divyenduz
jeśli chcę zrobić zabezpieczone punkty końcowe za pomocą JWT, to jak to zrobię w każdym pliku route.py
Ashok Sri,
17

Możesz użyć prostej sztuczki, która polega na zaimportowaniu zmiennej aplikacji flask z pliku głównego do innego pliku, na przykład:

test-routes.py

from __main__ import app

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

aw swoich głównych plikach, w których zadeklarowałeś aplikację flask, zaimportuj trasy testowe, takie jak:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

To działa z mojej strony.

nimeresam
źródło
2
To tylko przykład, __main__odnosi się do twojego pliku wejściowego, to wszystko!
nimeresam
3
Świetnie, wielkie dzięki. Schemat lub powyższe podejście do pakietu to przesada w przypadku małych aplikacji.
VH-NZZ
Oto link do dokumentów, w których wyjaśniono tę metodę: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Christopher
5

Podzielenie aplikacji na plany to świetny pomysł. Jeśli jednak to nie wystarczy i jeśli chcesz podzielić schemat na wiele plików py, jest to również możliwe przy użyciu zwykłego systemu importu modułów Pythona, a następnie przechodzenia przez wszystkie trasy importowane z innych plików .

Stworzyłem Gist z kodem, aby to zrobić:

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

O ile mi wiadomo, jest to obecnie jedyny możliwy sposób na podzielenie Planu. Nie jest możliwe tworzenie „pod-planów” w Flasku, chociaż jest otwarty problem z dużą ilością dyskusji na ten temat:

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

Ponadto, nawet gdyby było to możliwe (i prawdopodobnie jest to możliwe przy użyciu niektórych fragmentów z tego wątku wydania), podprogramy mogą i tak być zbyt restrykcyjne dla twojego przypadku użycia - np. Jeśli nie chcesz, aby wszystkie trasy w podmoduł, aby miał ten sam pod-prefiks adresu URL.

Jaza
źródło
4

To zadanie można wykonać bez planów i trudnych importów za pomocą scentralizowanej mapy URL

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
źródło