Как разделить приложение фляги на несколько файлов 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чтобы заставить это работать?

Ответы:


153

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

Тем не мение,

Flask использует концепцию чертежей для создания компонентов приложения и поддержки общих шаблонов в приложении или между приложениями.

Вы можете создать подкомпонент вашего приложения в виде Blueprint в отдельном файле:

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)

Чертежи также могут связывать определенные ресурсы: шаблоны или статические файлы. Пожалуйста, обратитесь к документации Flask для всех деталей.


1
как мы можем иметь маршруты проекта в файле, который является инициалом этого проекта?
Divyenduz

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

19

Вы можете использовать простой трюк, который заключается в импорте переменной приложения фляги из основного в другой файл, например:

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
Гениально, большое спасибо. Blueprint или пакетный подход, приведенный выше, излишни для небольших приложений.
VH-NZZ

Вот ссылка на документы, где объясняется этот метод: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Кристофер

1
@nimeresam Это сработало для меня, но я должен был узнать, что import test-routesне может быть в верхней части app.pyфайла. Он рухнул Gunicorn, но затем после перемещения импорта в нижней части файла, то это сработало. «Просто убедитесь, что модуль импортирован, и мы делаем это в нижней части файла»
Никлас Р.


5

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

Я создал Gist с кодом для этого:

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

Насколько я знаю, это единственный реальный способ разделить план на данный момент. Невозможно создать «вспомогательные чертежи» во Flask, хотя существует проблема, которая обсуждается по этому поводу:

https://github.com/mitsuhiko/flask/issues/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.