8

django-compressorの使用に頭を悩ませるのに本当に苦労しています。

これが私が達成しようとしていることです:

静的ファイルとアセットの分離(LESS、Coffeescript)

LESSCSSファイルとCoffeescriptファイルをアセットディレクトリに分割したい

例えば

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

画像などの静的アセットを静的ディレクトリに残す

例えば

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

これを行うために、アセットパスをSTATICFILES_DIRS変数に追加して、django-compressorがファイルを検索できるようにしました(これは期待どおりに機能します)。これは正しいアプローチですか?私はdjango-compressor専用の独立したロードパスを見つけようとしていましたが、これらのアセットを静的なものとして使用するつもりはないため、運がありませんでした。

本番デプロイメント用のファイルのコレクション

本番環境にデプロイするために、コンパイルされた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は取得されません。

これを行うために私が見つけた唯一の可能な方法は、collectstaticで--ignoreフラグを使用することです。

例えば

(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_ROOTおよびCOMPRESS_URL構成変数をいじりましたが、これらはさらに問題を引き起こすだけです。COMPRESS_ROOTを変更すると、collectstaticの問題は解決されますが、compressコマンドを使用すると、生成されたファイルは静的ファイルとは異なる場所に配置されます。

これらのソリューションは、ほとんどエレガントに見えません。これを行うためのより良い方法はありますか?何かが足りないような気がします。

助けてくれてありがとう:)

4

1 に答える 1

6

私はこれまでに見つけた最良の解決策を提供すると思いましたが、より良い代替案を自由に提案してください。

私の要件を妨げる最大の問題は、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 %}

これはアセットディレクトリから正常に読み取られ、ファイルを変更すると更新されます。

出力は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

次に、次のようにWebサーバーを実行し、サイトが機能していることを確認しました。

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

これが誰かに役立つことを願っています:)

于 2013-01-14T23:51:34.840 に答える