python - images - Con Flask, ¿cómo puedo servir robots.txt y sitemap.xml como archivos estáticos?
render file flask (3)
Coloque robots.txt
y sitemap.xml
en el directorio static
su aplicación y defina esta vista:
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:])
Esta pregunta ya tiene una respuesta aquí:
He leído en silencio algunos lugares que sirven archivos estáticos deben dejarse en el servidor, por ejemplo, en un par de las respuestas en esta pregunta SO . Pero utilizo OpenShift PaaS, y no puedo encontrar la manera de modificar el archivo .htaccess allí.
Encontré este pedazo de código que sirve el mapa del sitio desde una plantilla. Lo hice en mi aplicación tanto para el mapa del sitio como para robots.txt, como ese:
@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")
¿Hay algún daño en esto o mi enfoque está bien?
Flask ha incorporado soporte para servir archivos estáticos.
Cree un directorio /static
y coloque sus archivos allí. Luego, cuando static_url_path
instancia de Flask
, especifique el parámetro static_url_path
:
app = Flask(__name__, static_url_path=''/'')
El valor predeterminado es servir archivos estáticos de /static/
path, pero desea que se publiquen desde /
para que estén donde se esperaba.
Consulta los API API de Flask para obtener más información.
Además del código adicional e innecesario, el problema con su enfoque es si / cuando uno de los archivos que desea render_template
contiene algo que se parece a una etiqueta de plantilla para render_template
: puede causar un error de representación. Si render_template
que leer el archivo en la memoria (una vez, no dentro del método) y luego usar esa cadena como el cuerpo de la respuesta sin llamar a render_template
, al menos evitaría ese problema.
La mejor manera es establecer static_url_path en la url raíz
from flask import Flask
app = Flask(__name__, static_folder=''static'', static_url_path='''')