CORESERVERでDjango管理画面が崩れる原因と解決方法(collectstaticとstatic公開)

CORESERVER V2

はじめに

CORESERVER V2でDjango 6.0 を CGI で動かし、ロケット(The install worked successfully!)が表示されたあと、管理画面を開くとレイアウトが崩れる現象に遭遇しました。

本記事ではその原因と解決方法をまとめ、CORESERVER V2でDjangoサイトを作ったとき、静的ファイルを配信する方法を見ていきます。

Django管理画面

http://django.tomomori.net/cgi-bin/django.cgi/admin/ にアクセスすると、下記のようにCSSが適用されていないDjango管理画面が表示されました。

原因は「staticファイルが配信されていない」

管理画面が崩れる原因はほぼ確実にこれです。

https://django.tomomori.net/static/admin/css/base.css

これが 404 になっている場合、
Djangoの静的ファイルがWebサーバから配信できていません。

なぜ起きるのか?

CGI構成はこうなっています。

public_html/
 ├── cgi-bin/django.cgi   ← Django本体
 └── (staticが無い)

一方、collectstatic後は下記ディレクトリに静的ファイルが集められています。

/apps/django.tomomori.net/staticfiles/

問題は、

Webサーバは public_html 配下しか読めない

という点です。
/apps/... は公開領域ではないため、ApacheはCSSを読めません。

settings.py の設定を変更し collectstatic を実行する

まずやること:settings.py 修正

settings.pyをエディタで開き、STATIC_URLとSTATIC_ROOTを下記のように修正します。(なければ追加)settings.pyの場所は、わたしの場合は~/apps/django/config/settings.pyです。

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / "staticfiles"

collectstatic を実行する

cd ~/apps/django
source venv/bin/activate
python manage.py collectstatic

成功すると下記のように表示されます。

130 static files copied to '/home/xxx/apps/django/staticfiles'

public_html に static を作る

わたしの環境では、

/domains/django.tomomori.net/public_html/

が公開ディレクトリでした。

シンボリックリンク

そこで、下記のようにシンボリックリンクでstaticを作成します。

ln -s /home/xxx/apps/django/staticfiles \
/home/xxx/domains/django.tomomori.net/public_html/static

すると、下記が表示されるようになりました。
https://django.tomomori.net/static/admin/css/base.css

Django管理画面にアクセスする

これで、Django管理画面のCSSも表示できるようになっています。
https://django.tomomori.net/cgi-bin/django.cgi/admin/

.htaccess では解決しない理由

よく「.htaccessでなんとかできないか?」と考えますが、

  • .htaccessはURL書き換え
  • /apps はWeb公開外
  • 共有サーバではAlias設定不可

つまり、

物理的に public_html に置くしかない

のです。そのため、シンボリックリンクで public_html/static を作成しました。

まとめ

管理画面が崩れたら確認すること:

  1. STATIC_URL が /static/ になっているか
  2. STATIC_ROOT が設定されているか
  3. collectstatic を実行したか
  4. public_html に static を置いたか
  5. /static/admin/css/base.css が200か

ここまでやれば必ず直ります。
この記事が、どなたかのお役に立てば幸いです。

コメント

タイトルとURLをコピーしました