使用Flask和jinja2的sass

kas*_*rhj 41 python sass jinja2 flask

我想在我的Flask应用程序中包含一个sass编译器.有一种普遍接受的方式吗?

Aud*_*kas 55

可以使用Flask-Assets扩展(使用webassets库).以下是如何配置它以使用pyScss编译器(在Python中实现)用于SCSS:

from flask import Flask, render_template
from flask.ext.assets import Environment, Bundle

app = Flask(__name__)

assets = Environment(app)
assets.url = app.static_url_path
scss = Bundle('foo.scss', 'bar.scss', filters='pyscss', output='all.css')
assets.register('scss_all', scss)
Run Code Online (Sandbox Code Playgroud)

在模板中包括:

{% assets "scss_all" %}
<link rel=stylesheet type=text/css href="{{ ASSET_URL }}">
{% endassets %}
Run Code Online (Sandbox Code Playgroud)

SCSS文件也将在调试模式下编译.

pyScss只支持SCSS语法,但也有其他过滤器(sass,scsscompass)使用原始的Ruby实现.

  • 啊,我误解了你以前的问题.除非对源文件进行了更改,否则webassets会保存已编译的结果并缓存它们以防止不必要的重新编译.在调试模式下,通常会完全禁用过滤器,以免干扰开发(调试缩小的JS代码会很麻烦).CSS编译器过滤器是此规则的例外,因为通常您一直希望获得结果(CSS文件). (9认同)
  • 对于找到此答案的任何人:这假设您的scss文件存在于静态/相对于您的根路径.如果你想要它们在其他地方,比如assets /,添加这些行`assets.url = app.static_url_path; assets.directory = app.static_folder; assets.append_path( '资产')`.路径相对于根路径; 不要添加`/`.见https://github.com/miracle2k/flask-assets/issues/35#issuecomment-11840908 (2认同)
  • @bfontaine我找到了解决方法,你可以在创建一个bundle来监视一些其他文件时使用depends参数.请参阅https://webassets.readthedocs.org/en/latest/bundles.html (2认同)

shr*_*use 8

自2013年回答问题以来,有些事情发生了变化.

您不能在pyscss的同时安装scss,并期望pyscss过滤器在接受的答案中工作.

scss = Bundle('foo.scss', 'bar.scss', filters='pyscss', output='all.css')
Run Code Online (Sandbox Code Playgroud)

我收到的错误结束于:

File "/home/sri/crap/example/flask/lib/python2.7/site-packages/webassets/filter/pyscss.py", line 110, in setup
scss.config.STATIC_ROOT = self.static_root or self.ctx.directory
Run Code Online (Sandbox Code Playgroud)

您必须删除scss(即pip uninstall scss)并确保已安装pyscss(即pip install pyscss).

另请注意,您必须设置一些环境变量才能使pyscss正常工作:

app = Flask(__name__)

assets     = Environment(app)
assets.url = app.static_url_path
scss       = Bundle('index.scss', filters='pyscss', output='all.css')


assets.config['SECRET_KEY'] = 'secret!'
assets.config['PYSCSS_LOAD_PATHS'] = assets.load_path
assets.config['PYSCSS_STATIC_URL'] = assets.url
assets.config['PYSCSS_STATIC_ROOT'] = assets.directory
assets.config['PYSCSS_ASSETS_URL'] = assets.url
assets.config['PYSCSS_ASSETS_ROOT'] = assets.directory

assets.register('scss_all', scss)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅pyscss过滤器上的文档:http://webassets.readthedocs.io/en/latest/builtin_filters.html#pyscss

我希望这能节省很多时间,因为我浪费了一整天的时间.


Jac*_*ott 8

使用libsass 的简单单行解决方案。在您import sass简单地使用带有 dirname 关键字参数的 compile 函数之后,如下所示:

sass.compile(dirname=('path/to/sass', 'path/to/css'))
Run Code Online (Sandbox Code Playgroud)

您还可以选择设置输出样式,例如:

sass.compile(dirname=('path/to/sass', 'path/to/css'), output_style='compressed')
Run Code Online (Sandbox Code Playgroud)

如果您想在每次编辑时观看文件或目录以进行自动编译,请使用boussole