Як розділити додаток колбу на кілька файлів py?


146

На даний момент моя колбова програма складається з одного test.pyфайлу з кількома маршрутами та main()визначеним маршрутом. Чи я можу створити test2.pyфайл, який містить маршрути, з якими не оброблялися test.py?

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

Я стурбований тим, що маршрутів в занадто багато, test.pyі я хотів би зробити так, щоб я міг працювати python test.py, який також підбиратиме маршрути test.pyтак, ніби це частина одного файлу. Які зміни я повинен внести test.pyта / або включити, test2.pyщоб це працювало?

Відповіді:


152

Ви можете використовувати звичайну структуру пакету Python, щоб розділити додаток на кілька модулів, див. Документи на колбі.

Однак,

Flask використовує концепцію креслення для виготовлення компонентів додатків та підтримки загальних шаблонів у програмі або в різних додатках.

Ви можете створити підкомпонент свого додатка як креслення в окремому файлі:

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

А потім використовуйте його в основній частині:

from yourapplication.simple_page import simple_page

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

Креслення також можуть поєднувати конкретні ресурси: шаблони або статичні файли. Щоб отримати детальнішу інформацію, зверніться до Документів на колбу .


1
як ми можемо мати Blueprint маршрути в інший файл , який INIT цього плану?
divyenduz

якщо я хочу зробити захищені кінцеві точки за допомогою JWT, то як це робити в усіх файлах route.py
Ашок Шрі,

18

Ви можете використовувати простий трюк, який імпортує змінну доданої колби з головного всередині іншого файлу, наприклад:

test-routes.py

from __main__ import app

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

а в основні файли, де ви оголосили додаток колбу, імпортуйте тестові маршрути, наприклад:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

Це працює з мого боку.


2
Це просто приклад, __main__стосується вашого вхідного файлу, ось так!
nimeresam

3
Блискуче, велике спасибі. План або підхід до пакетів, наведених вище, є надмірними для невеликих додатків.
VH-NZZ

Ось посилання на документи, де пояснюється цей метод: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Крістофер

@nimeresam Це працювало для мене, але я повинен був дізнатися, що це import test-routesне може бути у верхній частині app.pyфайлу. Він зазнав аварії, але після переміщення імпорту в нижню частину файлу він працював. "просто гарантуючи імпорт модуля, і ми робимо це внизу файлу",
Ніклас Р.


5

Поділ програми на креслення - відмінна ідея. Однак якщо цього недостатньо, і якщо ви хочете розділити сам Blueprint на кілька файлів py, це також можливо, використовуючи звичайну систему імпорту модуля Python, а потім проглядати всі маршрути, які імпортуються з інших файлів .

Я створив Gist з кодом для цього:

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

Наскільки мені відомо, це єдиний здійсненний спосіб розділити План на даний момент. Неможливо створити "підпрограми" на Flask, хоча відкрите питання з великою кількістю обговорень з цього приводу:

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

Крім того, навіть якщо це було можливо (і, ймовірно, це можливо, використовуючи деякі фрагменти з цієї теми випуску), підпрограми можуть бути занадто обмежуючими для вашого випадку використання - наприклад, якщо ви не хочете, щоб усі маршрути в підмодуль мати той самий субфікс URL-адреси.


4

Цю задачу можна виконати без креслення та складного імпорту за допомогою централізованої 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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.