Розділіть програму Python Flask на кілька файлів


88

У мене проблеми з розумінням того, як розділити додаток-колбу на кілька файлів.

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

Я читав, що ви можете зробити це за допомогою Креслень, але я не зовсім впевнений, що маршрут для мене правильний.

Зрештою, я хочу запустити один основний файл 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"

Я знаю, що з цим прикладом це, очевидно, не спрацює, але чи можна зробити щось подібне?

Дякую

Відповіді:


158

Так, креслення - це правильний спосіб це зробити. Те, що ви намагаєтесь зробити, можна досягти таким чином:

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 / креслень, щоб їх чітко розділити. Це можна зробити з невеликою зміною вищезазначеного register_blueprintвиклику:

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

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


Це мені вдалось чудово! Думаю, я повинен був уважніше читати документи Blueprint.
user1751547

Гей, у мене питання. У наступному вище коді, чи відповідає 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 *

1
Виникла помилка імпорту
Абхішек Джебарадж,

Імпортування в середині файлу можна вважати поганою практикою?
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.