gpt4 book ai didi

django - 使用 Django 压缩机分离静态文件和资源以及使用collectstatic

转载 作者:行者123 更新时间:2023-12-03 01:45:18 25 4
gpt4 key购买 nike

我很难理解 django-compressor 的使用。

这是我试图实现的目标:

静态文件和资源的分离(LESS、Coffeescript)

我想将 LESS CSS 和 Coffeescript 文件分离到 Assets 目录中

例如

    app
└── assets
├── coffee
│ └── script.coffee
└── less
└── style.less

在我的静态目录中保留图像等静态资源

例如

    app
└── static
├── hello.txt
└── photo.jpg

为此,我将 Assets 路径添加到我的 STATICFILES_DIRS 变量中,以允许 django-compressor 查找文件(按预期工作)。这是正确的方法吗?我一直在尝试寻找专用于 django-compressor 的独立加载路径,但没有任何运气,因为我不打算将这些 Assets 用作静态资源。

生产部署的文件集合

为了部署到生产环境,我希望将编译后的 CSS 和 JS 文件以及 app/static 目录中的其他媒体(例如图像等)收集到 app/static-prod 目录中。但这效果不太好,因为使用collectstatic命令时也会收集资源。

例如

(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ ./manage.py collectstatic --noinput
Copying '/home/fots/django_learning/app/assets/less/style.less'
Copying '/home/fots/django_learning/app/assets/less/import.less'
Copying '/home/fots/django_learning/app/assets/coffee/script.coffee'
Copying '/home/fots/django_learning/app/static/photo.jpg'
Copying '/home/fots/django_learning/app/static/hello.txt'

5 static files copied.

使用 ./manage.py compress 命令只会对我编译的文件进行去皮,而不是本示例中的 photo.jpg 或 hello.txt。

我发现做到这一点的唯一可能的方法是使用 --ignore 标志和collectstatic

例如

(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ ./manage.py collectstatic --noinput --ignore=less --ignore=coffee
Copying '/home/fots/django_learning/app/static/photo.jpg'
Copying '/home/fots/django_learning/app/static/hello.txt'

2 static files copied.

我还搞乱了 COMPRESS_ROOTCOMPRESS_URL 配置变量,但这些只会带来更多麻烦。更改 COMPRESS_ROOT 可以解决收集静态问题,但现在使用压缩命令时,生成的文件最终会位于与静态文件不同的位置。

这些解决方案看起来并不优雅。有一个更好的方法吗?我感觉我失去了一些东西。

提前感谢您的帮助:)

最佳答案

我认为我会提供迄今为止找到的最佳解决方案,但请随时提出更好的替代方案。

阻碍我的要求的最大问题是 django-compressor 使用相同的路径来查找和输出。我找到的最佳解决方案如下。

创建自定义查找器

我们首先根据我称为 COMPRESS_SOURCE_ROOT 的新设置创建自定义查找器

from compressor.storage import CompressorFileStorage
from compressor.finders import CompressorFinder
from compressor.conf import settings


class CompressorFileAltStorage(CompressorFileStorage):
"""
This alternative django-compressor storage class is utilised
specifically for CompressorAltFinder which allows an independent
find path.

The default for ``location`` is ``COMPRESS_SOURCE_ROOT``.
"""
def __init__(self, location=None, base_url=None, *args, **kwargs):
if location is None:
location = settings.COMPRESS_SOURCE_ROOT
# The base_url is not used by the Finder class so it's irrelevant
base_url = None
super(CompressorFileAltStorage, self).__init__(location, base_url,
*args, **kwargs)

class CompressorAltFinder(CompressorFinder):
"""
A staticfiles finder that looks in COMPRESS_SOURCE_ROOT
for compressed files, to be used during development
with staticfiles development file server or during
deployment.
"""
storage = CompressorFileAltStorage

使用这个新的查找器

除了通常的“compressor.finders.compressorFinder”之外,只需将此查找器添加到您的 STATICFILES_FINDERS 设置中即可

例如

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
'mycomp.CompressorAltFinder',
'compressor.finders.CompressorFinder',
)

现在设置一个名为 COMPRESS_SOURCE_ROOT 的新设置

例如

COMPRESS_SOURCE_ROOT = os.path.join(APP_DIR, 'assets')

我也设置了 STATIC_ROOT

STATIC_ROOT = os.path.join(APP_DIR, 'static-prod')

在开发中测试解决方案

我专门测试了我的LESS源代码编译

(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ tree app/assets
app/assets
├── coffee
│ └── script.coffee
└── less
├── import.less
└── style.less

带有模板标签

{% compress css %}
<link rel="stylesheet" type="text/less"
href="{{ STATIC_URL }}less/style.less" />
{% endcompress %}

这是从 Assets 目录中成功读取的,并在我更改文件时更新。

输出放置在 static-prod 目录中:

(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ tree app/static-prod/
app/static-prod/
└── CACHE
├── css
│ ├── style.5abda32cfef7.css
│ └── style.6ca1a3d99280.css
└── js
└── script.8cb4f955df19.js

3 directories, 3 files

测试生产解决方案

以下是我的静态目录,供您引用

(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ tree app/static
app/static
├── hello.txt
└── photo.jpg

0 directories, 2 files

所以我们开始

(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ rm -rf app/static-prod
(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ ./manage.py collectstatic --noinput
Copying '/home/fots/django_learning/app/static/photo.jpg'
Copying '/home/fots/django_learning/app/static/hello.txt'

2 static files copied.
(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ ./manage.py compress
Found 'compress' tags in:
/home/fots/django_learning/app/templates/layout.html
Compressing... done
Compressed 2 block(s) from 1 template(s).
(django-cpython)fots@fotsies-ubprecise-01:~/django_learning$ tree app/static-prod
app/static-prod
├── CACHE
│ ├── css
│ │ └── 5abda32cfef7.css
│ ├── js
│ │ └── 3b9d1c08d2c5.js
│ └── manifest.json
├── hello.txt
└── photo.jpg

3 directories, 5 files

然后我按如下方式运行网络服务器并确认该网站可以运行

./manage.py runserver 0.0.0.0:8000 --insecure

希望这对那里的人有帮助:)

关于django - 使用 Django 压缩机分离静态文件和资源以及使用collectstatic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14315466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com