Djangoのstaticファイルが404から復活した話


あらすじ

djangoのstaticファイルがrunserverだとアクセスできたのにapacheだとアクセスできませんでした。解決方法が分かったので、頭の整理を兼ねて書き起こしました。Bitnami前提のため、直接Apacheを入れている人は読みかえてください。

流れ

  1. Windows PC を用意。 64bit。
  2. BITNAMI DJANGO STACK を利用して、mysqlとapacheをインストールする。
  3. Create A New Django Projectを参考にdjangoでプロジェクトを作成
  4. Deploy A Django Projectを参考にデプロイ設定
  5. サイトにアクセス
  6. 画像やCSSを読み込めまない!
  7. settings.pyとhttpd-app.confに追記して collectstatic した。
  8. サイトにアクセス
  9. 無事に読み込み成功!

読み込まなかったファイル

画像の例
<img  width="30" src="{% static '[app-name]/bitmap.png' %}" height="30" class="d-inline-block align-top" alt="">
CSSの例
<link rel="stylesheet" href="{% static '[app-name]/css/style.css' %}">

ディレクトリ構成

directory-tree
[project-directory]/
   ┣ [project-name]/
   ┃    ┣ settings.py
   ┃    ┗ ... 
   ┣ static/
   ┃    ┗ ... 
   ┣ [app-name]/
   ┃    ┣ static/
   ┃    ┃    ┗ [app-name]/
   ┃    ┃         ┣ css/
   ┃    ┃         ┃   ┗ ...
   ┃    ┃         ┣ js/
   ┃    ┃         ┃   ┗ ...
   ┃    ┃         ┣ img/
   ┃    ┃         ┃   ┗ ...
   ┃    ┃         ┗ ...
   ┃    ┗ ...
   ┗ deploy/   # deploy用のディレクトリ
        ┃
        ┣ [app-name]/
        ┃    ┗ ...
        ┗ ...

staticのアクセス許可を設定

[projectname]\settings.py
STATIC_URL = '/static/'  # 配信用のURL
STATIC_ROOT = os.path.join(BASE_DIR, 'deploy')  # プロジェクト直下のdeployディレクトリを指定
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),  # プロジェクト直下のstaticディレクトリを指定
)
conf\httpd-app.conf:追記
# collectstaticでコピーしたstaticディレクトリのパスを登録
Alias /static/ [deploy用のディレクトリ]

# staticへのアクセスを許可
<Directory [deploy用のディレクトリ]>
    Require all granted
</Directory>

[deploy用のディレクトリ]はWindows10では

"%userprofile%/Bitnami Django Stack projects/[project-dirctory]/deploy/"

Staticファイルのコレクション

設定追記が出来たらpython manage.py collectstaticで一か所にまとめます。

Note : adminサイトなどを用意している場合、
そのstaticも一緒にまとまるので予想外のファイル数に驚かないように!

apacheを再起動してブラウザでアクセス

参考にしたサイト

Excelsior!