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?

usuario1431282
fuente

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 .

tbicr
fuente
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.

Andrew Grow
fuente
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