実現したいこと
×の表示になっている画像を表示させたい
発生している問題・分からないこと
Djangoを使って、AWSのLightsailの本番環境にて、サービス開発をしていますが、画像が非表示状態になってしまっており、まず、Apacheのエラーログからエラー確認を行い、様々な対応をしていますが、画像表示が出来ない状態がつづいています。
エラーメッセージ
error
1AH01630: client denied by server configuration: /opt/bitnami/proj 2ects/student_info/myvenv/student_info/media, referer: https://〇〇〇.com/le 3ssons/detail/3
該当のソースコード
/opt/bitnami/projects/student_info/myvenv/student_info/lessons/views.py
from django.views.generic import ListView, DetailView from django.views.generic.edit import CreateView, UpdateView, DeleteView from .models import Lesson from django.urls import reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .forms import LessonSearchForm,LessonForm from django.shortcuts import render, redirect from django.core.mail import send_mail from django.conf import settings from .forms import LessonForm class LessonDetailView(LoginRequiredMixin, DetailView): model = Lesson template_name = "lessons/lesson_detail.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) print(context) # デバッグ用にコンテキストを出力 return context
/opt/bitnami/projects/student_info/myvenv/student_info/templates/lessons/lesson_detail.html
{% extends "base.html" %} {% load django_bootstrap5 %} {% block title %}生徒情報詳細{% endblock %} {% block content %} <h1>生徒情報詳細</h1> <form method="post" enctype="multipart/form-data"> {% csrf_token %} <table class="table table-responsive table-striped table-hover table-bordered"> <tbody> <tr> <th>授業日</th> <td>{{ lesson.day }}</td> </tr> <tr> <th>生徒</th> <td>{{ lesson.student }}</td> </tr> <tr> <th>教科</th> <td>{{ lesson.subject }}</td> </tr> <tr> <th>講師</th> <td>{{ lesson.teacher }}</td> </tr> <tr> <th>宿題確認</th> <td>{{ lesson.homework_done }}</td> </tr> <tr> <th>授業テキスト名</th> <td>{{ lesson.get_textbook_display }}</td> </tr> <tr> <th>授業ページ</th> <td>{{ lesson.contents }}</td> </tr> <tr> <th>授業テキスト名②</th> <td>{{ lesson.get_textbook_2_display }}</td> </tr> <tr> <th>授業ページ②</th> <td>{{ lesson.contents_2 }}</td> </tr> <tr> <th>解答スピード</th> <td>{{ lesson.speed }}</td> </tr> <tr> <th>正確性</th> <td>{{ lesson.accuracy }}</td> </tr> <tr> <th>理解度</th> <td>{{ lesson.understanding }}</td> </tr> <tr> <th>気分・意欲</th> <td>{{ lesson.feeling }}</td> </tr> <tr> <th>次回の宿題(テキスト名)</th> <td>{{ lesson.get_next_homework_text_display }}</td> </tr> <tr> <th>次回の宿題(ページ数)</th> <td>{{ lesson.next_homework_contents }}</td> </tr> <tr> <th>次回の宿題(テキスト名)②</th> <td>{{ lesson.get_next_homework_text_2_display }}</td> </tr> <tr> <th>次回の宿題(ページ数)②</th> <td>{{ lesson.next_homework_contents_2 }}</td> </tr> <tr> <th>講評</th> <td>{{ lesson.memo }}</td> </tr> <tr> <th>授業シート</th> <td style="text-align: center;"> {% if lesson.class_img %} <img src="{{ lesson.class_img.url }}" alt="授業シート" style="max-width: 100%; height: auto;"> {% else %} 画像はありません {% endif %} </td> </tr> </tbody> </table> <p>画像のURL: {{ lesson.class_img.url }}</p> <br> <a href="{% url 'lesson_list' %}">戻る</a> </form> {% endblock %}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
エラーログから、client denied by server configuration というエラーが発生しており、これはApacheの設定によってメディアファイルへのアクセスが拒否されていると判断し、/opt/bitnami/projects/student_info/myvenv/student_info/media ディレクトリに対してのアクセスが問題となっていると考え下記を試みました。
⒈Apacheの設定ファイルのアクセス許可を確認
下記のコードが記載されていることを確認しました。
Alias /media/ /opt/bitnami/projects/student_info/myvenv/student_info/media_local/ <Directory /opt/bitnami/projects/student_info/myvenv/student_info/media_local> Require all granted </Directory>
⒉ ルートディレクトリ上のsettings.pyにおけるMEDIA_ROOT と MEDIA_URLの設定確認
下記の設定を確認しました。
MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media_local'
表示させたい画像は、「media_local」内に保存されています。
⒊ media_localのディレクトリとファイルのアクセス権限の確認
下記のコードにて、ディレクトリとファイルのアクセス権限を確認しました。
ls -l /opt/bitnami/projects/student_info/myvenv/student_info/media_local
その結果、下記のアクセス権状態でした。
-rw-r--r-- 1 daemon www-data 2605779 Oct 4 01:46 _DSC9018_anPLj0W.JPG -rw-r--r-- 1 daemon www-data 2605779 Oct 3 02:57 _DSC9018.JPG drwxr-xr-x 2 daemon www-data 4096 Oct 3 02:57 media_local -rw-r--r-- 1 daemon www-data 3631 Oct 3 02:57 noImage_kq7P3zn.png -rw-r--r-- 1 daemon www-data 3631 Oct 3 02:57 noImage.png -rw-r--r-- 1 daemon www-data 63259 Oct 11 10:37 勉強風景_2MWu6XG.jpg -rw-r--r-- 1 daemon daemon 63259 Oct 18 02:05 勉強風景_5Zostgw.jpg -rw-r--r-- 1 daemon www-data 63259 Oct 14 11:37 勉強風景_CVwknHR.jpg -rw-r--r-- 1 daemon www-data 63259 Sep 18 02:27 勉強風景.jpg -rw-r--r-- 1 daemon www-data 63259 Sep 20 02:37 勉強風景_kihGx6T.jpg -rw-r--r-- 1 daemon daemon 63259 Oct 18 01:57 勉強風景_rNnZsPm.jpg -rw-r--r-- 1 daemon www-data 63259 Sep 26 01:21 勉強風景_uDLM3ZR.jpg
⒋ ブラウザで直接アクセス
そこで、アクセス権が許可されていることを確認したので、一度、直接画像のURLをブラウザで入力し、確認しました。
https://○○〇.com/media/%E5%8B%89%E5%BC%B7%E9%A2%A8%E6%99%AF_5Zostgw.jpg
その結果、「Forbidden
You don't have permission to access this resource.」となり、画像が表示できませんでした。
⒌ AppArmorの設定確認
ApacheのAppArmorプロファイルの内容を確認しました。
sudo cat /etc/apparmor.d/usr.sbin.apache2
白紙だったため、下記のコードを加えて、アクセス権の設定を行いました。
# Apache web server profile /usr/sbin/apache2 { # アクセス権の設定 /opt/bitnami/apache2/** r, /opt/bitnami/projects/student_info/myvenv/student_info/media_local/ r, /opt/bitnami/projects/student_info/myvenv/student_info/media_local/** rw, /usr/sbin/apache2 ix, }
設定適用のため、下記のコードを入力。
sudo systemctl reload apparmor
上記試しましたが、画像表示には至っておりません。
補足
Django 4.1.7
Apache/2.4.59 (Unix)
該当するページは、「templates/lessons/lesson_detail.html」なので、念のため、データベースから画像を引っ張ってこようとできているのかを確認するため、画像のURLを下記のように、して確認してみました。
その結果、下記のように、画像のURLが表示されているので、media_localディレクトリの画像を引き出そうとしているように思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。