Разделить приложение Python Flask на несколько файлов


88

У меня возникли проблемы с пониманием того, как разбить приложение Flask на несколько файлов.

Я создаю веб-службу и хочу разбить api на разные файлы (AccountAPI.py, UploadAPI.py, ...), так что у меня нет одного огромного файла python.

Я читал, что вы можете сделать это с помощью Blueprints, но я не совсем уверен, что этот маршрут мне подходит.

В конечном итоге я хочу запустить один основной файл python и включить другие файлы, чтобы при его запуске они считались одним большим файлом.

Например, если у меня есть Main.py и AccountAPI.py, я хочу сделать это:

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"

Я знаю, что в этом примере это явно не сработает, но можно ли сделать что-то подобное?

Благодарность

Ответы:


159

Да, Blueprints - правильный способ сделать это. То, что вы пытаетесь сделать, может быть достигнуто следующим образом:

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"

Если это вариант, вы можете рассмотреть возможность использования разных префиксов URL-адресов для разных API / Blueprints, чтобы четко разделить их. Это можно сделать с небольшой модификацией вышеуказанного register_blueprintвызова:

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

Для получения дополнительной документации вы также можете ознакомиться с официальной документацией .


Это отлично сработало для меня, спасибо! Думаю, мне следовало более внимательно прочитать документацию Blueprint.
user1751547 05

Эй, у меня вопрос. В приведенном выше коде совпадает ли URL-адрес accountList () с доменом / счетами / учетной записью?
jeyraof

4
Могут ли Main.py и AccountAPI.py иметь общую глобальную переменную, которая находится в любом из файлов?
matchifang

Есть ли простое решение для помещения accountListкласса в один и тот же файл?
GA1

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

41

С помощью Blueprintвы можете добавлять свои маршруты вroutes каталог.

Состав

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)

Если вы хотите добавить новый файл маршрута, скажем accounts.py, вам просто нужно создать файл accounts.pyв routesкаталоге, как index.pyи users.py, а затем импортировать его в routes.__init__.pyфайл

from .accounts import *


Импорт в середине файла можно считать плохой практикой?
TomSawyer

3

Если вы используете чертежи и хотите перенаправить / перенаправить на URL-адрес вашего чертежа внутри используемого вами шаблона, вам необходимо использовать правильный оператор url_for.

В вашем случае, если вы хотите открыть учетную запись url своего плана, вы должны указать это в своем шаблоне следующим образом :

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

а для основного приложения это будет выглядеть так:

redirect(url_for('account_api.account'))

В противном случае библиотека werkzeug выдаст ошибку.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.