Ссылка на статические файлы Flask с url_for

91

Как вы используете url_forFlask для ссылки на файл в папке? Например, у меня в staticпапке есть несколько статических файлов , некоторые из которых могут находиться во вложенных папках, например static/bootstrap.

Когда я пытаюсь обслужить файл из static/bootstrap, я получаю сообщение об ошибке.

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

Я могу ссылаться на файлы, которые не во вложенных папках, и это работает.

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

Как правильно ссылаться на статические файлы url_for? Как использовать url_forдля создания URL-адресов статических файлов на любом уровне?

user1431282
источник

Ответы:

182

По умолчанию у вас есть staticконечная точка для статических файлов. Также у Flaskприложения есть следующие аргументы:

static_url_path: можно использовать для указания другого пути к статическим файлам в Интернете. По умолчанию используется имя static_folderпапки.

static_folder: папка со статическими файлами, которая должна обслуживаться static_url_path. По умолчанию используется «статическая» папка в корневом пути приложения.

Это означает, что filenameаргумент примет относительный путь к вашему файлу static_folderи преобразует его в относительный путь в сочетании с static_url_default:

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

преобразует путь static_folder/path/to/fileк файлу из в путь URL static_url_default/path/to/file.

Итак, если вы хотите получить файлы из static/bootstrapпапки, используйте этот код:

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

Что будет преобразовано в (с использованием настроек по умолчанию):

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

Также посмотрите url_forдокументацию .

tbicr
источник
Обратите внимание, что при инициализации Flaskдобавляется правило URL-адреса для staticконечной точки, поэтому изменение этих атрибутов в Flaskэкземпляре не влияет на url_for('static', ...)результат. Чтобы изменить пост-инициализацию статической конечной точки, см. Суть gist.github.com/brycepg/593ffb5ce9316d2871c7f24f9de34c24
Брайс Гуинта,
1

В моем случае у меня была специальная инструкция в файле конфигурации nginx:

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

Все клиенты получили 404, потому что nginx ничего не знал о Flask.

Надеюсь, это кому-то поможет.

Эндрю Гроу
источник
Первичный файл конфигурации - это /etc/nginx/nginx.conf (в Linux). Это может быть аналогичный путь в Windows (я действительно не знаю)
Эндрю Гроу
Это конфигурация на стороне сервера, если вы просто разрабатываете приложение на своем рабочем столе, вероятно, оно вам не понадобится.
adamczi