Django5.1.2でのcollectstaticでハマった話し

2025/01/06に公開

やろうとしたこと

collectstaticをする時に静的ファイルをAzureのストレージに置きたくて生成AIを使いながら
作業していたがいくら検証しても解決しなかった。

静的ファイルの収集したら自動でAzureコンテナに格納されるよ!と教えてくれていた。

python manage.py collectstatic --noinput

そして、こう書けとずっと言われてた。。

# settings.py
AZURE_ACCOUNT_NAME = os.getenv("AZURE_ACCOUNT_NAME")
AZURE_ACCOUNT_KEY = os.getenv("AZURE_ACCOUNT_KEY")
AZURE_CONTAINER = os.getenv("AZURE_CONTAINER")
STATICFILES_STORAGE = "storages.backends.azure_storage.AzureStorage"

バージョン違いの書き方をずっと提案されていた

いくら検証しても書き方も設定も間違っていないのに期待通りに行かなかったのでググったら
django-storagesの公式がヒット。
Djangoのバージョンが古い方の書き方をずっと言われていたのが原因だった。
https://django-storages.readthedocs.io/en/latest/backends/azure.html

新しい書き方に変えて解決

# settings.py
STORAGES = {
    # collectstatic が参照する設定
    "staticfiles": {
        "BACKEND": "storages.backends.azure_storage.AzureStorage",
        "OPTIONS": {
            "account_name": os.getenv("AZURE_ACCOUNT_NAME"),
            "account_key": os.getenv("AZURE_ACCOUNT_KEY"),
            "azure_container": os.getenv("AZURE_CONTAINER"),  # 静的ファイル格納用コンテナ
            "overwrite_files": True,  # 同名ファイルを上書きする
            # 必要に応じて以下のような設定を追加
            # "ssl": True,
            # "custom_domain": "cdn.mycompany.com",
            # "location": "prefix/path",
        },
    },
    # default(メディアファイル用)も入れたい場合は↓を追加
    # "default": {
    #     "BACKEND": "storages.backends.azure_storage.AzureStorage",
    #     "OPTIONS": {
    #         "account_name": os.getenv("AZURE_ACCOUNT_NAME"),
    #         "account_key": os.getenv("AZURE_ACCOUNT_KEY"),
    #         "azure_container": "media",
    #         "overwrite_files": True,
    #     },
    # },
}

生成AIプログラミングにありがちな罠でした。
ちゃんとバージョン指定すると良かったなと反省。

Discussion