Фильтр автоопределения не работает в Flask_Assets
Я попытался настроить фильтр автоопределения для работы с flask_assets, следуя инструкциям в документации Flask_Assets, но, похоже, он не применяется для фильтра. Вот мой код:
# construct flask app object
from flask import Flask, render_template_string
flask_args = { 'import_name': __name__ }
flask_app = Flask(**flask_args)
from flask_assets import Environment, Bundle
assets = Environment(flask_app)
assets.config['AUTOPREFIXER_BIN'] = 'postcss'
assets.config['AUTOPREFIXER_BROWSERS'] = [ '> 1%' ]
css_min = Bundle('../styles/mycss.css', filters='autoprefixer', output='styles/test.css')
assets.register('css_assets', css_min)
@flask_app.route('/')
def landing_page():
html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\
<head>{% assets "css_assets" %}\
<link rel="stylesheet" href="{{ ASSET_URL }}" type="text/css">\
{% endassets %}\
<title>Hello</title>\
</head>\
<h1>Hello World</h1>\
<p>Just a test of flask</p>'
return render_template_string(html), 200
if __name__ == '__main__':
flask_app.run(host='0.0.0.0', port=5000)
Я смог успешно применить фильтры cssmin, pyscss, uglifyjs и jsmin. Я также могу запустить autoprefixer в командной строке, чтобы успешно скомпилировать преобразованный вывод:
postcss --use autoprefixer --autoprefixer.browsers "> 1%" -o test.css mycss.css
Тем не менее, при попытке запуска авторефиксера через регистрацию flask_assets, процесс не выдает ошибку и не требует времени для компиляции. Он создает выходной файл, но когда я проверяю полученный файл, ни один из префиксов не был применен.
ОБНОВЛЕНИЕ: Эта проблема, кажется, возникает всякий раз, когда вы пытаетесь настроить параметры для ЛЮБОГО фильтра. Я не смог заставить uglifyjs принять 'UGLIFYJS_EXTRA_ARGS' или чтобы фильтр pyscss принял новый стиль, используя 'PYSCSS_STYLE'. Я попытался установить эти конфигурации в качестве переменных среды, используя os.environ['AUTOPREFIXER_BIN'], а также пытаясь передать их через flask.config['AUTOPREFIXER_BIN']. Но ни один из параметров конфигурации не был применен при запуске фильтра. Мне также не ясно, где в самом коде параметры конфигурации создаются Bundle или Environment.
Одна публикация SO утверждает, что нашел способ заставить работать настройки конфигурации, но эта публикация не показывает весь рабочий процесс того, как необходимо настроить flask_assets для использования этих параметров.
Возможно, кто-то может помочь мне понять, что я делаю неправильно?
1 ответ
Autoprefixer:
В вашем коде нет ничего плохого 1. Вы просто не используете правильный фильтр для последней версии Autoprefixer. Если вы посмотрите историю выпусков по этой ссылке, начиная с версии 6.0.0, она начала использовать postcss. Ваш код будет работать для версий старше 6.0.0.
Webassets обеспечивает поддержку версий после 6.0.0 (включительно), предоставляя autoprefixer6
фильтр.
Поэтому все, что вам нужно сделать, это изменить фильтр (ы) при инициализации вашего пакета, например, так:
css_min = Bundle('../styles/mycss.css', filters='autoprefixer6', output='styles/test.css')
Конфигурации других фильтров:
Не использовать os.environ
Это не способ установить переменные конфигурации для Flask и /questions/tagged/flask-extensions. Самым распространенным (и предпочтительным) способом настройки конфигурации для расширений является использование самого флакона Config, а в больших проектах это делается с помощью отдельного файла конфигурации. Расширения получат свои параметры конфигурации из конфигурации фляги.
В зависимости от того, какое расширение вы используете, вы также можете установить конфигурацию отдельно, как вы сделали, но это редко используется, из того, что я видел до сих пор.
Пожалуйста, ознакомьтесь с документацией, относящейся к конфигурации Flask, чтобы найти хорошие примеры того, как правильно настроить конфигурацию для вашего приложения.
from flask import Flask, render_template_string
from flask_assets import Environment, Bundle
# construct flask app object
flask_args = {'import_name': __name__}
flask_app = Flask(**flask_args)
assets = Environment(flask_app)
# specify the bin path (optional), required only if not globally installed
assets.config['AUTOPREFIXER_BIN'] = 'path/to/postcss'
assets.config['AUTOPREFIXER_BROWSERS'] = ['> 1%', ]
# use the autoprefixer6 updated filter
css_min = Bundle('../styles/mycss.css', filters='autoprefixer6',
output='styles/test.css')
assets.register('css_assets', css_min)
@flask_app.route('/')
def landing_page():
html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\
<head>{% assets "css_assets" %}\
<link rel="stylesheet" href="{{ ASSET_URL }}" type="text/css">\
{% endassets %}\
<title>Hello</title>\
</head>\
<h1>Hello World</h1>\
<p>Just a test of flask</p>'
return render_template_string(html), 200
if __name__ == '__main__':
flask_app.run(host='0.0.0.0', port=5000)
Не забудьте очистить ранее сгенерированные файлы, если исходный файл css/js не изменился, т.е. удалить выходные файлы и .webassets-cache
папка.
1 За исключением стиля кода и соглашений о форматировании!