Entonces esto es vergonzoso. Tengo una aplicación que reuní Flask
y por ahora solo sirve una página HTML estática con algunos enlaces a CSS y JS. Y no puedo encontrar en qué parte de la documentación se Flask
describe la devolución de archivos estáticos. Sí, podría usar, render_template
pero sé que los datos no están en plantilla. Pensé send_file
o url_for
era lo correcto, pero no pude conseguir que funcionen. Mientras tanto, estoy abriendo los archivos, leyendo contenido y armando un Response
tipo MIME apropiado:
import os.path
from flask import Flask, Response
app = Flask(__name__)
app.config.from_object(__name__)
def root_dir(): # pragma: no cover
return os.path.abspath(os.path.dirname(__file__))
def get_file(filename): # pragma: no cover
try:
src = os.path.join(root_dir(), filename)
# Figure out how flask returns static files
# Tried:
# - render_template
# - send_file
# This should not be so non-obvious
return open(src).read()
except IOError as exc:
return str(exc)
@app.route('/', methods=['GET'])
def metrics(): # pragma: no cover
content = get_file('jenkins_analytics.html')
return Response(content, mimetype="text/html")
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_resource(path): # pragma: no cover
mimetypes = {
".css": "text/css",
".html": "text/html",
".js": "application/javascript",
}
complete_path = os.path.join(root_dir(), path)
ext = os.path.splitext(path)[1]
mimetype = mimetypes.get(ext, "text/html")
content = get_file(complete_path)
return Response(content, mimetype=mimetype)
if __name__ == '__main__': # pragma: no cover
app.run(port=80)
¿Alguien quiere dar una muestra de código o url para esto? Sé que esto va a ser muy simple.
python
flask
static-files
hughdbrown
fuente
fuente
Respuestas:
El método preferido es usar nginx u otro servidor web para servir archivos estáticos; podrán hacerlo más eficientemente que Flask.
Sin embargo, puede usar
send_from_directory
para enviar archivos desde un directorio, lo que puede ser bastante conveniente en algunas situaciones:No , no usar
send_file
osend_static_file
con una ruta proporcionada por el usuario.send_static_file
ejemplo:fuente
send_from_directory
está diseñado para resolver ese problema de seguridad. Existe un error si la ruta conduce fuera del directorio particular.<path>
es equivalente a<string:path>
, y porque desea que Flask garantice un parámetro similar a la ruta que solicita<path:path>
.Si solo desea mover la ubicación de sus archivos estáticos, entonces el método más simple es declarar las rutas en el constructor. En el siguiente ejemplo, he movido mis plantillas y archivos estáticos a una subcarpeta llamada
web
.static_url_path=''
elimina cualquier ruta anterior de la URL (es decir, la predeterminada/static
).static_folder='web/static'
para servir cualquier archivo encontrado en la carpetaweb/static
como archivos estáticos.template_folder='web/templates'
Del mismo modo, esto cambia la carpeta de plantillas.Con este método, la siguiente URL devolverá un archivo CSS:
Y finalmente, aquí hay un complemento de la estructura de carpetas, donde
flask_server.py
está la instancia de Flask:fuente
get_static_file('index.html')
?También puede, y este es mi favorito, configurar una carpeta como ruta estática para que todos puedan acceder a los archivos.
Con ese conjunto puedes usar el HTML estándar:
fuente
project/static/style.css
disponible.Estoy seguro de que encontrará lo que necesita allí: http://flask.pocoo.org/docs/quickstart/#static-files
Básicamente, solo necesita una carpeta "estática" en la raíz de su paquete, y luego puede usar
url_for('static', filename='foo.bar')
o vincular directamente sus archivos con http://example.com/static/foo.bar .EDITAR : como se sugiere en los comentarios, puede usar directamente la
'/static/foo.bar'
ruta URL PERO laurl_for()
sobrecarga (en cuanto al rendimiento) es bastante baja, y usarla significa que podrá personalizar fácilmente el comportamiento después (cambiar la carpeta, cambiar la ruta URL, mueva sus archivos estáticos a S3, etc.).fuente
'/static/foo.bar'
directamente?Puedes usar esta función:
fuente
send_static_file
con la entrada del usuario. No use esta solución en nada importante.Lo que uso (y ha estado funcionando muy bien) es un directorio de "plantillas" y un directorio "estático". Coloco todos mis archivos .html / plantillas de frascos dentro del directorio de plantillas, y static contiene CSS / JS. render_template funciona bien para archivos html genéricos, que yo sepa, independientemente de la medida en que usó la sintaxis de plantillas de Flask. A continuación se muestra una llamada de muestra en mi archivo views.py.
Solo asegúrese de usar url_for () cuando desee hacer referencia a algún archivo estático en el directorio estático separado. Probablemente termines haciendo esto de todos modos en tus enlaces de archivos CSS / JS en html. Por ejemplo...
Aquí hay un enlace al tutorial informal "Frasco" canónico: muchos consejos geniales para ayudarlo a comenzar.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
fuente
Un ejemplo de trabajo más simple basado en las otras respuestas es el siguiente:
Con el HTML llamado index.html :
IMPORTANTE: Y index.html está en una carpeta llamada static , lo que significa que
<projectpath>
tiene el.py
archivo y<projectpath>\static
tiene elhtml
archivo.Si desea que el servidor esté visible en la red, use
app.run(debug=True, host='0.0.0.0')
EDITAR: para mostrar todos los archivos en la carpeta si se solicita, use esto
Lo cual es esencialmente
BlackMamba
la respuesta, así que denles un voto positivo.fuente
Para el flujo angular + repetitivo que crea el siguiente árbol de carpetas:
Yo uso la siguiente solución:
Ayuda a redefinir la carpeta 'estática' a personalizada.
fuente
Así que hice que las cosas funcionaran (según la respuesta @ user1671599) y quería compartirlo con ustedes.
(Espero hacerlo bien, ya que es mi primera aplicación en Python)
Hice esto -
Estructura del proyecto:
server.py:
AppStarter.py:
fuente
Una de las formas simples de hacerlo. ¡Salud!
demo.py
Ahora cree el nombre de la carpeta llamada plantillas . Agregue su archivo index.html dentro de la carpeta de plantillas
index.html
Estructura del proyecto
fuente
render_template
solución, pero que no quería hacerlo porque el archivo era estático y no tenía reemplazos: "Sí, podría usar render_template pero sé que los datos no están en plantilla".Pensé en compartir ... este ejemplo.
Esto funciona mejor y simple.
fuente
Uso
redirect
yurl_for
Este servidor todos los archivos (css & js ...) referenciados en su html.
fuente
La forma más simple es crear una carpeta estática dentro de la carpeta principal del proyecto. Carpeta estática que contiene archivos .css.
carpeta principal
Imagen de la carpeta principal que contiene carpetas estáticas y de plantillas y script de matraz
matraz
html (diseño)
html
fuente
Si tiene plantillas en su directorio raíz, colocar la aplicación = Flask ( nombre ) funcionará si el archivo que lo contiene también está en la misma ubicación, si este archivo está en otra ubicación, deberá especificar la ubicación de la plantilla para habilitar Frasco para señalar la ubicación
fuente
Todas las respuestas son buenas, pero lo que funcionó bien para mí es simplemente usar la función simple
send_file
de Flask. Esto funciona bien cuando solo necesita enviar un archivo html como respuesta cuando host: port / ApiName mostrará la salida del archivo en el navegadorfuente
Por defecto, el matraz utiliza una carpeta de "plantillas" para contener todos sus archivos de plantilla (cualquier archivo de texto plano, pero generalmente
.html
o algún tipo de lenguaje de plantilla como jinja2) y una carpeta "estática" para contener todos sus archivos estáticos (es decir,.js
.css
y tus imágenes)En su
routes
, puede usarrender_template()
para representar un archivo de plantilla (como digo anteriormente, por defecto se coloca en latemplates
carpeta) como respuesta a su solicitud. Y en el archivo de plantilla (generalmente es un archivo similar a .html), puede usar algunos.js
y / o archivos '.css', así que supongo que su pregunta es cómo vincular estos archivos estáticos al archivo de plantilla actual.fuente
Si solo está tratando de abrir un archivo, puede usarlo
app.open_resource()
. Así que leer un archivo se vería algo asífuente