Link para arquivos estáticos do Flask com url_for


89

Como você usa url_forno Flask para fazer referência a um arquivo em uma pasta? Por exemplo, tenho alguns arquivos estáticos na staticpasta, alguns dos quais podem estar em subpastas como static/bootstrap.

Quando tento servir um arquivo de static/bootstrap, recebo um erro.

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

Posso fazer referência a arquivos que não estão em subpastas com isso, o que funciona.

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

Qual é a maneira correta de fazer referência a arquivos estáticos url_for? Como faço url_forpara gerar urls para arquivos estáticos em qualquer nível?

Respostas:


178

Você tem por padrão o staticponto de extremidade para arquivos estáticos. Além disso, o Flaskaplicativo tem os seguintes argumentos:

static_url_path: pode ser usado para especificar um caminho diferente para os arquivos estáticos na web. O padrão é o nome da static_folderpasta.

static_folder: a pasta com os arquivos estáticos que devem ser servidos static_url_path. O padrão é a pasta 'estática' no caminho raiz do aplicativo.

Isso significa que o filenameargumento pegará um caminho relativo para o seu arquivo static_foldere o converterá em um caminho relativo combinado com static_url_default:

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

irá converter o caminho do arquivo static_folder/path/to/filepara o caminho do url static_url_default/path/to/file.

Portanto, se você deseja obter arquivos da static/bootstrappasta, use este código:

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

Qual será convertido para (usando as configurações padrão):

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

Veja também a url_fordocumentação .


Observe que Flaskadiciona uma regra de url para o staticendpoint na inicialização, portanto, alterar esses atributos em uma Flaskinstância não altera o url_for('static', ...)resultado. Para alterar a pós-inicialização do endpoint estático, consulte esta essência gist.github.com/brycepg/593ffb5ce9316d2871c7f24f9de34c24
Bryce Guinta

1

No meu caso, tive instruções especiais sobre o arquivo de configuração nginx:

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

Todos os clientes receberam '404' porque nginx nada conhecido sobre o Flask.

Espero que ajude alguém.


Estou no Windows. Onde este arquivo está localizado? Estou tentando carregar arquivos .js com url_for e não funciona.
Nikos

O arquivo de configuração principal é /etc/nginx/nginx.conf (no Linux). Pode ser um caminho semelhante no Windows (eu não sei realmente)
Andrew Grow

Esta é a configuração do lado do servidor, se você está apenas desenvolvendo um aplicativo em seu desktop, provavelmente não o tem / precisa.
adamczi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.