SASS处理器,用于将SCSS文件编译成*.css文件,在渲染时或离线状态下。
项目描述
django-sass-processor
在开发Django项目时,是否烦恼于必须运行Compass、Grunt或Gulp守护进程?
那么,这个应用程序正是为你准备的!无需管理第三方服务或特殊IDE插件,即可动态编译SASS/SCSS文件。
使用此库的其他良好理由
- 直接从源代码引用SASS/SCSS文件,而不是引用编译后的CSS文件,不需要依赖另一个创建它们的工具,该工具隐藏在源代码树中。
- 使用Django的
settings.py
进行路径、盒子大小等的配置,而不是使用另一个SCSS特定文件(通常是_variables.scss
),来保存这些。 - 通过直接调用Django项目中的Python函数来扩展你的SASS函数。
- 直接在Django开发服务器的调试控制台中查看SCSS错误。
django-sass-processor在渲染模板时将*.scss
或*.sass
文件转换为*.css
。出于性能考虑,这仅执行一次,因为预处理器会跟踪时间戳,只有当任何导入的SASS/SCSS文件比相应的生成CSS文件更年轻时,才会重新编译。
简介
此Django应用程序提供了一个模板标签{% sass_src 'path/to/file.scss' %}
,可以用它来替代内置的模板标签static
。此模板标签也适用于Jinja2模板。
如果SASS/SCSS文件要通过Media
类或media
属性进行引用,则可以直接使用SASS处理器。
此外,django-sass-processor附带一个管理命令,可以作为一个离线操作将sass_src
模板标签中所有出现的内容转换为内容。因此,在生产环境中不需要libsass
编译器。
在开发期间,会生成与编译的*.css
文件一起的sourcemap。这使得调试样式表错误变得更容易。
使用此工具,你可以安全地从Django项目中移除Ruby安装的"Compass"和"SASS"。你也不需要基于node.js的任何目录"监视"守护进程。
项目的首页
在GitHub上
https://github.com/jrief/django-sass-processor
请使用问题跟踪器报告错误或提出新功能建议。
安装
pip install libsass django-compressor django-sass-processor
仅当使用manage.py compilescss
命令进行离线编译时,才需要django-compressor
。
如果使用离线编译预编译并部署了SASS/SCSS文件,则生产环境中不需要libsass
。
配置
在settings.py
中添加到
INSTALLED_APPS = [
...
'sass_processor',
...
]
django-sass-processor附带一个特殊的查找器,用于定位位于STORAGES['sass_processor']['ROOT']
(对于Django >= 4.2.)或SASS_PROCESSOR_ROOT
(对于Django <= 4.1.)的目录中生成的*.css
文件,或者如果没有设置,则位于STATIC_ROOT
。只需将其添加到您的settings.py
。如果您的settings.py
中没有STATICFILES_FINDERS
,请务必包括Django的默认查找器。
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'sass_processor.finders.CssFinder',
...
]
可选地,添加一个额外的搜索路径列表,SASS编译器在SASS/SCSS文件中使用@import "...";
语句时可能会检查。
import os
SASS_PROCESSOR_INCLUDE_DIRS = [
os.path.join(PROJECT_PATH, 'extra-styles/scss'),
os.path.join(PROJECT_PATH, 'node_modules'),
]
此外,django-sass-processor将遍历所有已安装的Django应用程序(INSTALLED_APPS
)并检查它们的静态文件夹。如果其中任何一个包含匹配正则表达式模式^_.+\.(scss|sass)$
(意思是:文件名以下划线开头且类型为scss
或sass
)的文件,则将该应用程序特定的静态文件夹添加到libsass
的包含目录中。您可以通过设置来禁用此功能:
SASS_PROCESSOR_AUTO_INCLUDE = False
如果您的SASS/SCSS文件中,您还想要导入(使用@import "path/to/scssfile";
)不以下划线开头的文件,则可以在您的设置中配置另一个正则表达式模式,例如
SASS_PROCESSOR_INCLUDE_FILE_PATTERN = r'^.+\.scss$'
将会查找所有类型的 scss
文件。请记住,以下划线开头的 SASS/SCSS 文件是为了被其他 SASS/SCSS 文件导入的,而以字母或数字开头的文件是为了被 HTML 标签 <link href="{% sass_src 'path/to/file.scss' %}" ...>
包含的。
在开发过程中,或者当 SASS_PROCESSOR_ENABLED = True
时,编译后的文件将被放置到由 STORAGES['sass_processor']['ROOT']
(对于 Django >= 4.2)或 SASS_PROCESSOR_ROOT
(对于 Django <= 4.1)引用的文件夹中。如果没有设置,则此设置默认为 STATIC_ROOT
。将位置放在工作目录之外可以防止自动生成的文件污染您的本地 static/css/...
目录。因此,请确保这个目录可以被 Django runserver 写入。
在 settings.py
中调整 SASS 编译器参数。
整数 SASS_PRECISION
设置输出 CSS 的浮点精度。libsass 的默认值为 5
。注意:bootstrap-sass 需要 8
,否则将出现各种布局问题。
SASS_PRECISION = 8
SASS_OUTPUT_STYLE
设置编译结果的编码风格,可以是 compact
、compressed
、expanded
或 nested
之一。默认情况下,在 DEBUG
时为 nested
,在生产中为 compressed
。
注意:libsass-python 0.8.3 在 Windows 上保存结果时编码存在问题,该问题已修复,并将包含在未来的 pip
包发布中,同时避免使用 compressed
输出风格。
SASS_OUTPUT_STYLE = 'compact'
Jinja2 支持
sass_processor.jinja2.ext.SassSrc
是一个 Jinja2 扩展。将其添加到您的 Jinja2 环境中,以启用 sass_src
标签,不需要 load
标签。以下是向 Django 添加 Jinja2 环境的示例。
在 settings.py
TEMPLATES = [{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'yourapp.jinja2.environment'
},
...
}]
如果您仍在其他地方使用 Django 模板,请确保添加默认模板后端。这已在 升级模板文档 中说明。
在 yourapp/jinja2.py
# Include this for Python 2.
from __future__ import absolute_import
from jinja2 import Environment
def environment(**kwargs):
extensions = [] if 'extensions' not in kwargs else kwargs['extensions']
extensions.append('sass_processor.jinja2.ext.SassSrc')
kwargs['extensions'] = extensions
return Environment(**kwargs)
如果您想使用 compilescss
命令,则还必须在您的设置中添加以下内容。
from yourapp.jinja2 import environment
COMPRESS_JINJA2_GET_ENVIRONMENT = environment
用法
在您的 Django 模板中
{% load sass_tags %}
<link href="{% sass_src 'myapp/css/mystyle.scss' %}" rel="stylesheet" type="text/css" />
上面的模板代码将被渲染为 HTML
<link href="/static/myapp/css/mystyle.css" rel="stylesheet" type="text/css" />
您可以在 Sekizai 的 {% addtoblock "css" %}
语句中安全地使用此模板标签。
在媒体类或属性中
在 Python 代码中,您可以直接访问 SASS 处理器的 API。这在 Django 的 admin 或表单框架中非常有用。
from sass_processor.processor import sass_processor
class SomeAdminOrFormClass(...):
...
class Media:
css = {
'all': [sass_processor('myapp/css/mystyle.scss')],
}
使用来自 https://caniuse.cn/ 的值添加 CSS 规则的供应商前缀
编写 SCSS 应该快速简单,您不需要关心是否要在 CSS 指令中添加供应商特定的前缀。不幸的是,没有纯 Python 包可以解决这个问题,但使用一些 node 模块,我们可以将其添加到我们的处理流程中。
以超级用户身份安装
npm install -g npx
并在您的项目根目录中安装
npm install postcss-cli autoprefixer
确保 node_modules
的路径与设置指令 STATICFILES_DIRS
中的条目相对应(见下文)。
如果您的系统路径中找不到 npx
,请使用设置指令 NODE_NPX_PATH = /path/to/npx
指向该可执行文件。
如果一切设置正确,django-sass-processor 将将所有必需的供应商前缀添加到编译后的 CSS 文件中。有关更多信息,请参阅 Autoprefixer 包。
要禁用自动前缀,请设置 NODE_NPX_PATH = None
。
重要提示:如果已安装 npx
,但本地 node_modules
中缺少 postcss
和/或 autoprefixer
,则必须将 NODE_NPX_PATH
设置为 None
,否则 django-sass-processor 将不知道如何后处理生成的 CSS 文件。
离线编译
如果您想预编译整个项目中所有SASS/SCSS文件的实例,请在命令行中调用
./manage.py compilescss
这对于准备生产环境很有用,因为在生产环境中SASS/SCSS文件不能即时编译。
为了简化部署,编译后的*.css
文件与其对应的SASS/SCSS文件存储在相邻位置。编译完文件后运行
./manage.py collectstatic
就像在正常部署中一样。
如果您不想在生产环境中暴露SASS/SCSS文件,请使用以下命令部署
./manage.py collectstatic --ignore=*.scss
要删除本地静态目录中的编译后的*.css
文件,只需反转上述命令
./manage.py compilescss --delete-files
这将删除所有之前生成的*.css
文件的实例。
或者您可以将编译结果直接编译到STORAGES['sass_processor']['ROOT']
[Django >= 4.2.](Django >= 4.2.) 或 SASS_PROCESSOR_ROOT
[Django <= 4.1.](Django <= 4.1.) 目录(如果未指定,则为STATIC_ROOT
)
./manage.py compilescss --use-storage
结合使用--delete-files
开关从该位置清除结果。
如果您使用的是替代模板引擎,请在--engine
参数中设置其名称。目前支持django
和jinja2
,有关如何设置COMPRESS_JINJA2_GET_ENVIRONMENT
以配置jinja2引擎支持的详细信息,请参阅django-compressor文档。
在离线编译期间,django-sass-processor将解析所有Python文件并查找对sass_processor('path/to/sassfile.scss')
的调用。因此,指定文件名的字符串必须是硬编码的,并且不应拼接或以某种方式生成。
替代模板
默认情况下,django-sass-processor将从.html模板中定位SASS/SCSS文件,但您可以通过在设置中使用以下内容来扩展或覆盖此行为
SASS_TEMPLATE_EXTS = ['.html','.jade']
通过settings.py配置SASS变量
SASS中,设置图标和字体正确的包含路径是一个棘手的问题。通常这通过一个_variables.scss
文件来完成,但这会阻碍通过项目的settings.py
进行配置。
为了避免需要重复的配置设置,django-sass-processor提供了一个SASS函数,可以从项目的settings.py
获取任何任意配置指令。这特别有用来设置您的Glyphicons字体目录的包含路径。假设,Bootstrap-SASS已经通过以下方式安装
npm install bootstrap-sass
然后定位名为node_modules
的目录,并将其添加到设置中,这样您的字体就可以通过Django的django.contrib.staticfiles.finders.FileSystemFinder
访问
STATICFILES_DIRS = [
...
('node_modules', '/path/to/your/project/node_modules/'),
...
]
NODE_MODULES_URL = STATIC_URL + 'node_modules/'
使用SASS函数get-setting
,可以覆盖任何SASS变量,该变量在项目的settings.py
中配置。对于Glyphicons字体搜索路径,将以下内容添加到您的_variables.scss
$icon-font-path: unquote(get-setting(NODE_MODULES_URL) + "bootstrap-sass/assets/fonts/bootstrap/");
并且@import "variables";
每次需要Glyphicons时。然后您可以安全地从您的HTML模板中删除任何字体引用,例如<link href="/path/to/your/fonts/bootstrap/glyphicons-whatever.ttf" ...>
。
通过Python函数配置SASS变量
甚至可以在任何模块内部调用Python函数。通过将SASS_PROCESSOR_CUSTOM_FUNCTIONS
添加到项目的settings.py
来实现。这应包含一个SASS函数名称到Python函数名称的映射。
示例
SASS_PROCESSOR_CUSTOM_FUNCTIONS = {
'get-color': 'myproject.utils.get_color',
}
这允许从任何*.scss
文件中调用Python函数。
$color: get-color(250, 10, 120);
在这里,我们将参数'250, 10, 120'传递到Python模块myproject.utils
中的函数def get_color(red, green, blue)
。请注意,此函数接收值作为sass.Number
,因此使用red.value
等提取值。
如果这些自定义函数返回的值不是字符串,则将其转换为Python字符串或转换为类型为sass.SassNumber
的值。对于其他类型,请参阅其文档。
此类自定义函数必须显式接受参数,否则sass_processor
不知道如何映射它们。因此不能使用变量参数列表。
错误报告
当 django-sass-processor 以调试模式运行并无法编译 SASS/SCSS 文件时,它会引发 sass.CompileError
异常。这将在 Django 调试控制台上直接显示错误位置,这在开发过程中非常有用。
可以使用设置变量 SASS_PROCESSOR_FAIL_SILENTLY
来覆盖此行为。如果将其设置为 True
,则不会引发该异常,编译错误消息将被发送到 Django 日志记录器。
使用其他存储后端来存储编译后的 CSS 文件
在内部,SASS 处理器会使用您在设置中配置的任何存储作为 STORAGES['staticfiles']
。这意味着您可以使用用于服务静态文件的任何内容,例如 S3。
如果您的部署需要从其他地方服务生成的 CSS 文件(例如,当您的静态文件存储在运行时不可写且您需要在生产中重新编译 CSS 时),可以使用自定义存储类。要使用自定义存储,请在 STORAGES['sass_processor']['BACKEND']
中配置它。您还可以在 STORAGES['sass_processor']['OPTIONS']
[Django >= 4.2.](https://packaging.pythonlang.cn/tutorials/installing-packages/) 或 SASS_PROCESSOR_STORAGE_OPTIONS
[Django <= 4.1.>] 中配置一个包含将作为关键字参数传递给存储类的选项的字典(例如,如果您想使用 FileSystemStorage
,但具有不同的 location
或 base_url
)
# For Django >= 4.2.*
STORAGES['sass_processor'] = {
'BACKEND': 'django.core.files.storage.FileSystemStorage',
'OPTIONS': {
'location': '/srv/media/generated',
'base_url': 'https://media.myapp.example.com/generated'
}
}
# For Django <= 4.1.*
SASS_PROCESSOR_STORAGE = 'django.core.files.storage.FileSystemStorage'
SASS_PROCESSOR_STORAGE_OPTIONS = {
'location': '/srv/media/generated',
'base_url': 'https://media.myapp.example.com/generated'
}
亚马逊的 S3 存储
使用来自 django-storages 的 S3 存储后端及其常规配置(如果您不将其用于服务静态文件)
# For Django >= 4.2.*
STORAGES['sass_processor'] = {
'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage'
}
# For Django <= 4.1.*
SASS_PROCESSOR_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
Heroku
如果您要将应用程序部署到 Heroku,请使用 heroku-buildpack-django-sass 构建包来自动为您编译 scss。
开发
要本地运行测试,请克隆存储库,并在您的本地副本中创建一个新的虚拟环境。以下命令
python -m pip install --upgrade pip
pip install Django
pip install -r tests/requirements.txt
python -m pytest tests
项目详情
下载文件
下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于 安装包 的信息。