С 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='')