Flask Обновление путей при развертывании - PullRequest
0 голосов
/ 11 марта 2020

Я разрабатывал приложение flask с использованием сервера разработки. Теперь, когда я готов развернуть его на другой машине (на которой уже есть куча других вещей), я изучаю, как использовать mod_wsgi для подключения к apache (который уже запущен на сервере). Я бы хотел, чтобы все мое приложение flask находилось по пути, подобному /mysite. Я знаю, что могу использовать WSGIScriptAlias для обозначения префикса и отправки flask всего после этого префиксного пути.

Это хорошо работает для того, чтобы все маршруты вели себя как положено, но как насчет моего HTML / css / javascript files? Если я ссылаюсь на путь в файле HTML, нужно ли его менять? Или есть какой-то способ исправить это более глобально?

Я волнуюсь, что меня ожидает много переписать ...

Спасибо, Джек

1 Ответ

1 голос
/ 15 апреля 2020

Чертежи позволяют структурировать ваше приложение в очень модульной форме, но также имеют преимущество объявления определенного префикса 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 .

Я знаю, что это много информации, но мне было трудно понять эту концепцию, когда я только начинал учиться, поэтому я пытаюсь помочь спасти кого-то еще от головной боли. Ура!

...