Python flask - обслуживание статических файлов

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

@app.route('/')
def home():
    return url_for('static', filename='hi.html')

Наряду с моим файлом "hi.html" (который содержит в себе некоторый базовый html), который находится в каталоге static, то, что я получаю, когда загружаю страницу, буквально это:

/static/hi.html

Я использую url_for неправильно?

Ответ 1

url_for просто возвращает именно URL-адрес этого файла. Похоже, вы хотите redirect к URL-адресу для этого файла. Вместо этого вы просто отправляете текст URL-адреса клиенту в качестве ответа.

from flask import url_for, redirect

@app.route('/')
def home():
    return redirect(url_for('static', filename='hi.html'))

Ответ 2

Вы получаете правильный результат для того, что делаете. url_for генерирует url для аргументы, которые вы ему даете. В вашем случае вы создаете url для файла hi.html в каталоге static. Если вы хотите действительно вывести файл, вам нужно

from flask import render_template, url_for

...

    return render_template(url_for("static", filename="hi.html"))

Но в этот момент ваш статический каталог должен находиться в каталоге шаблонов (где бы он ни был настроен для жизни).

Если вы собираетесь обслуживать статические html файлы, подобные этому, то мое предложение будет состоять в том, чтобы обслуживать их за пределами приложения флэшей, направляя трафик на /static/.* непосредственно с вашего веб-сервера. В Интернете есть много примеров для этого, используя nginx или apache.