Чертежи позволяют структурировать ваше приложение в очень модульной форме, но также имеют преимущество объявления определенного префикса c url для каждого набора маршрутов. Это очень удобно в больших приложениях, потому что вы можете указать свои маршруты маршрутов относительно , и вместо необходимости обновлять всех ваших маршрутов, если ваша структура URL изменяется, вы просто обновляете префикс для этого проекта . Я немного упрощаю, но вы можете прочитать больше об этом шаблоне структурирования приложений здесь
Реальное преимущество Blueprints для небольших приложений заключается в том, что если у вас есть только один объект Blueprint, связанный с вашим приложением, вы можете просто объявить префикс url для этого Blueprint, и он будет применять префикс к каждому маршруту в вашем приложении!
Вот очень простой пример, демонстрирующий эту концепцию
File structure
.
├── app.py
└── static
└── index.js
index.js
console.log('hello from static!');
app.py
import os
from flask import Flask, Blueprint, jsonify, url_for
# there are a million ways to handle configuration,
# this is just for simplicity's sake for this example.
configuration = dict(
development = dict(
ENV='development',
APPLICATION_ROOT='/',
),
production=dict(
ENV='production',
APPLICATION_ROOT='/mysite/',
),
)
# get configuration based on environment
config_key = os.getenv('FLASK_CONFIG', 'development')
config_dict = configuration[config_key]
app = Flask(__name__, static_url_path=config_dict['APPLICATION_ROOT'])
app.config.update(config_dict)
bp = Blueprint('myapp', __name__)
@bp.route('/')
def index():
return jsonify(message='hello from root!')
@bp.route('/foo')
def foo():
path = url_for('static', filename='index.js')
return jsonify(path=path)
# attach your routes to the application
app.register_blueprint(bp, url_prefix=app.config['APPLICATION_ROOT'])
if __name__ == '__main__':
app.run()
Самые большие отличия от того, к чему вы, вероятно, привыкли видим - мы используем @bp.route
вместо @app.route
, это так, что наши пути могут быть автоматически установлены относительно нашего префикса url - мы должны сделать дополнительный шаг app.register_blueprint()
, чтобы Flask мог чтобы найти наши маршруты (без этого вы получите только 404)
Когда мы запускаем python3 app.py
(или, flask run
) и перейдем к обычному маршруту root /
, мы получим наше сообщение .
localhost:5000
{"message": "hello from root!"}
Когда мы посещаем наш /foo
маршрут, мы получаем следующий ответ, сообщающий нам, где находится наш javascript файл
localhost:5000/foo
{"path":"/index.js"}
Навигация там мы действительно видим содержимое нашего файла
localhost:5000/index.js
console.log('hello from static!);
Ранее, поскольку у нас не было переменной среды FLASK_CONFIG
, наше приложение по умолчанию использовало наши параметры разработки . Теперь давайте посмотрим, что произойдет, когда мы установим это значение, как если бы мы работали в
$ export FLASK_CONFIG=production
. Теперь, переход к нашему предыдущему маршруту root возвращает 404, поэтому вместо этого вместо go используется наш производственный префикс url.
localhost:5000/mysite
{"message": "hello from root!"}
Перейдите к нашему /foo
маршруту, чтобы увидеть, где находится наш файл c *
localhost:5000/mysite/foo
{"path":"/mysite/index.js"}
И, наконец, при переходе по этому пути на самом деле отображается наш javascript файл
localhost:5000/mysite/index.js
console.log('hello from static!);
Если вы предпочитаете префикс вашего состояния c активы с чем-то еще, как часть URL, возможно, даже просто /static/<your-file>
, все, что вам нужно сделать, это изменить эту строку в app.py
# from this
app = Flask(__name__, static_url_path=config_dict['APPLICATION_ROOT'])
# to this
app = Flask(__name__, static_url_path=config_dict['APPLICATION_ROOT']+'static/')
теперь ваши пути будут выглядеть как localhost:5000/static/index.js
, для пример.
Наконец, чтобы решить вашу проблему с необходимостью изменить ваши пути в файлах HTML: вы можете использовать ту же функцию url_for()
, что продемонстрирована в маршруте foo
, чтобы ссылаться на любое место в вашем файле. план. Хитрость заключается в обращении к имени функции маршрута , поэтому, если вы хотите создать ссылку на foo()
, вы должны использовать url_for('bp.foo')
, где 'bp'
- строка, используемая в функции Blueprint
.
Я знаю, что это много информации, но мне было трудно понять эту концепцию, когда я только начинал учиться, поэтому я пытаюсь помочь спасти кого-то еще от головной боли. Ура!