С Flask, как я могу служить robots.txt и sitemap.xml в качестве статических файлов?

Я читал о том, что несколько мест, обслуживающих статические файлы, нужно оставить на сервере, например, в нескольких ответах на этот вопрос qaru.site/info/28606/.... Но я использую OpenShift PaaS и не могу понять, как изменить файл .htaccess.

Я наткнулся на этот фрагмент кода, который обслуживает карту сайта из шаблона. Я сделал это в своем приложении как для sitemap, так и для файла robots.txt, например:

@app.route("/sitemap.xml")
def sitemap_xml():
    response= make_response(render_template("sitemap.xml"))
    response.headers['Content-Type'] = 'application/xml'
    return response

@app.route("/robots.txt")
def robots_txt():
    return render_template("robots.txt")

Есть ли какой-либо вред в этом, или мой подход в порядке?

Ответ 1

Поместите robots.txt и sitemap.xml в каталог приложения static и определите это представление:

from flask import Flask, request, send_from_directory

@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
    return send_from_directory(app.static_folder, request.path[1:])

Ответ 2

Flask имеет встроенную поддержку для обслуживания статических файлов.

Создайте каталог /static и поместите туда свои файлы. Затем, когда вы создаете экземпляр Flask, укажите параметр static_url_path:

app = Flask(__name__, static_url_path='/')

По умолчанию используется статические файлы из пути /static/, но вы хотите, чтобы они служили от /, поэтому они ожидаются.

Подробнее см. Документы API флагов.

В дополнение к накладным и ненужным кодам проблема с вашим подходом заключается в том, что если/когда один из файлов, которые вы хотите обслуживать, содержит что-то похожее на тег шаблона на render_template - вы можете вызвать ошибку рендеринга. Если вы должны были прочитать файл в памяти (один раз, а не внутри метода), используйте эту строку в качестве тела ответа без вызова render_template, вы, по крайней мере, избежите этой проблемы.

Ответ 3

Лучший способ - установить static_url_path на корневой URL

from flask import Flask

app = Flask(__name__, static_folder='static', static_url_path='')