Enlace a archivos estáticos de Flask con url_for


91

¿Cómo se usa url_foren Flask para hacer referencia a un archivo en una carpeta? Por ejemplo, tengo algunos archivos estáticos en la staticcarpeta, algunos de los cuales pueden estar en subcarpetas como static/bootstrap.

Cuando intento entregar un archivo de static/bootstrap, obtengo un error.

 <link rel=stylesheet type=text/css href="{{ url_for('static/bootstrap', filename='bootstrap.min.css') }}">

Puedo hacer referencia a archivos que no están en subcarpetas con esto, que funciona.

 <link rel=stylesheet type=text/css href="{{ url_for('static', filename='bootstrap.min.css') }}">

¿Cuál es la forma correcta de hacer referencia a archivos estáticos url_for? ¿Cómo lo uso url_forpara generar URL para archivos estáticos en cualquier nivel?

Respuestas:


182

Tiene por defecto el staticpunto final para archivos estáticos. Además, la Flaskaplicación tiene los siguientes argumentos:

static_url_path: se puede utilizar para especificar una ruta diferente para los archivos estáticos en la web. Por defecto, el nombre de la static_foldercarpeta.

static_folder: la carpeta con archivos estáticos en la que se deben servir static_url_path. Por defecto, la carpeta 'estática' en la ruta raíz de la aplicación.

Significa que el filenameargumento tomará una ruta relativa a su archivo static_foldery lo convertirá en una ruta relativa combinada con static_url_default:

url_for('static', filename='path/to/file')

convertirá la ruta del archivo a la ruta de static_folder/path/to/filela URL static_url_default/path/to/file.

Entonces, si desea obtener archivos de la static/bootstrapcarpeta, use este código:

<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='bootstrap/bootstrap.min.css') }}">

Que se convertirá a (usando la configuración predeterminada):

<link rel="stylesheet" type="text/css" href="static/bootstrap/bootstrap.min.css">

También mire la url_fordocumentación .


Tenga en cuenta que Flaskagrega una regla de URL para el staticpunto final después de la inicialización, por lo que cambiar estos atributos en una Flaskinstancia no cambia el url_for('static', ...)resultado. Para cambiar la inicialización de la publicación del punto final estático, consulte este artículo gist.github.com/brycepg/593ffb5ce9316d2871c7f24f9de34c24
— Bryce Guinta

1

En mi caso, tuve una instrucción especial en el archivo de configuración nginx:

location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
            try_files $uri =404;
    }

Todos los clientes han recibido '404' porque nginx no sabe nada sobre Flask.

Espero que ayude a alguien.


El archivo de configuración principal es /etc/nginx/nginx.conf (en Linux). Puede ser una ruta similar en Windows (no lo sé realmente)
— Andrew Grow

Esta es la configuración del lado del servidor, si solo está desarrollando una aplicación en su escritorio, probablemente no la tenga o la necesite.
— Adamczi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.