質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

解決済

Django EC2 Apache 本番環境のみ画像のアップロードが行えない Pillowによるエラー

nika_nika
nika_nika

総合スコア37

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

1回答

0評価

0クリップ

185閲覧

投稿2022/05/10 13:32

編集2022/05/12 11:35

実現したいこと

画像をアップロードした時の500エラーを解決したい。

ローカル環境での画像アップロードは行えますが、本番環境だと画像をアップロードした時のみ500エラーが返ってきます。

追記
エラーの原因がPillow関連だということがわかりました。
Pillowをインストールしているはずですが、下記のエラーが出ます。
Pillowインストール時のpython3のバージョンと実行python3のバージョンは同じかと思います。
PILはインストールしておりません。

No module named 'PIL'

のエラーを解決したい。

本番環境

OS:mac
Django:3.2.10
Python:3.9
Linux
Django:3.2.12
python:3.7
MySQL:8.0
Apache:2.4.53
EC2
S3

コード

settings.py

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'xxxxxxxxxx', 'USER': 'xxxxxxxxxxx', 'PASSWORD': 'xxxxxxxxxx', 'HOST': 'xxxxxxxxxxxxxx.rds.amazonaws.com', 'PORT': '3306', } } STATIC_URL = 'static/' # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' #CSSの読み込み STATICFILES_DIRS = [ BASE_DIR / "static" ] #カスタムユーザーモデルをデフォルトに設定 AUTH_USER_MODEL = 'register.User' #registerの設定 LOGIN_URL = 'register:login' LOGIN_REDIRECT_URL = 'admin:top' LOGOUT_REDIRECT_URL = 'register:login' # 画像の読み込み # MEDIA_ROOT = os.path.join(BASE_DIR) # S3の設定 AWS_LOCATION = 'static' DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' AWS_STORAGE_BUCKET_NAME = 'xxxxxxxx' AWS_S3_REGION_NAME = 'ap-northeast-1' AWS_ACCESS_KEY_ID = 'xxxxxxxxx' AWS_SECRET_ACCESS_KEY = 'xxxxxxxxxxxxx'

model.py

def upload_image_to(instance, filename): staff = str(instance.staff_id) return os.path.join('static', 'images', staff, filename) class Staff(models.Model): staff_id = models.BigAutoField(primary_key=True,validators=[MaxValueValidator(8)]) staff_code = models.IntegerField() staff_name = models.CharField(max_length=255) staff_phone_1 = models.CharField(max_length=255,blank=True,null=True) staff_sex = models.SmallIntegerField(validators=[MaxValueValidator(1)]) staff_email = models.EmailField() staff_login_password = models.CharField(max_length=255) staff_status = models.SmallIntegerField(validators=[MaxValueValidator(2)],blank=True,null=True) staff_image = models.ImageField(max_length=255, default='static/images/default.png', upload_to=upload_image_to)

views.py

class StaffCreateForm(View): return render(request,"pages/staffCreate.html",context) def post(self, request): posted = Staff( staff_code = request.POST["staff_code"], staff_name = request.POST["staff_name"], staff_email = request.POST["staff_email"], staff_login_password = request.POST["staff_login_password"], staff_sex = request.POST["staff_sex"], ) staff_phone_1_result = request.POST["staff_phone_1"] staff_status_result = request.POST["staff_status"] staff_image_result = request.FILES.get("staff_image") if not "" == staff_phone_1_result: posted.staff_phone_1 = request.POST["staff_phone_1"] if not "" == staff_status_result: posted.staff_status= request.POST["staff_status"] #画像をアップロードしなかった際、デフォルトの画像を挿入 if None == staff_image_result: posted.staff_image = str("static/images/default.png") else: posted.staff_image = request.FILES.get("staff_image") posted.save() return redirect("admin:staffList") class StaffEditForm(UpdateView): template_name = 'pages/staffEdit.html' model = Staff fields = [ 'staff_code', 'staff_name', 'staff_email', 'staff_login_password', 'staff_sex', 'staff_phone_1', 'staff_status', 'staff_image', ] def get_success_url(self): return reverse('admin:staffList')

staffCreate.html

<div class="p-staff__formBox"> <p class="p-staff__formText">画像</p> <div class="p-staff__imageBlock"> <div class="p-staff__imageTest"> <!-- デフォルト画像 --> <img id="no_image" class="{% if staff.staff_image != none %}hidden{% endif %}" src="https://xxxxxxxxx.amazonaws.com/static/images/default.png"> <!-- 画像がある場合 --> <img id="image_preview" class="{% if staff.staff_image == none %}hidden{% endif %}" src="https://xxxxxxxxxxxx.amazonaws.com/{{ staff.staff_image }}"> </div> <label class="p-staff-imageLabel"> 画像をアップロード <input class="p-staff__imageBtn" type="file" accept=".png, .jpeg, .jpg, .gif, .img" name="staff_image" onchange="previewImage(this)"> </label> </div> </div> <!-- プレビュー --> <script> function previewImage(elem) { let fileReader = new FileReader(); fileReader.onload = (function(){ document.getElementById('image_preview').classList.remove('hidden'); document.getElementById('no_image').classList.add('hidden'); document.getElementById('image_preview').src = fileReader.result; }) fileReader.readAsDataURL(elem.files[0]); } </script>

etc/httpd/conf.d/アプリ名.conf

"/etc/httpd/conf.d/アプリ名.conf" 18L, 503B 9,15 全て LoadModule wsgi_module /usr/local/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so ServerName xx.xx.xxx.xxx WSGIScriptAlias / /home/ec2-user/アプリ名/config/wsgi.py WSGIPythonPath /home/ec2-user/アプリ名:/usr/bin/python3 Alias /static/ /home/ec2-user/アプリ名/static/ <Directory /home/ec2-user/アプリ名/static> Require all granted </Directory> <Directory /home/ec2-user/アプリ名/config> <Files wsgi.py> Require all granted </Files> </Directory>

試したこと

DBの初期化やsettings.pyのSTATIC_URLのパスを変えたりしてみましたが、解決できませんでした。
画像アップロード時のみ500エラーが出る事象がネットに転がっていなかったため、皆様のお力を借りたいです。よろしくお願い致します。
足りない記述やエラーの要因になりそうなものがありましたら、教えていただけると幸いです。

追記

エラー文

ModuleNotFoundError at /admin/staff/edit/2 No module named 'PIL' Request Method: POST Request URL: http://xx.xx.xxx.xxx/admin/staff/edit/2 Django Version: 3.2.12 Exception Type: ModuleNotFoundError Exception Value: No module named 'PIL' Exception Location: /usr/local/lib/python3.7/site-packages/django/forms/fields.py, line 631, in to_python Python Executable: /usr/bin/python3 Python Version: 3.7.10 Python Path: ['/home/ec2-user/アプリ名', '/usr/bin/python3', '/usr/lib64/python37.zip', '/usr/lib64/python3.7', '/usr/lib64/python3.7/lib-dynload', '/usr/local/lib64/python3.7/site-packages', '/usr/local/lib/python3.7/site-packages', '/usr/lib64/python3.7/site-packages', '/usr/lib/python3.7/site-packages'] Server time: Tue, 10 May 2022 14:57:42 +0000

python

$ python3 Python 3.7.10 (default, Jun 3 2021, 00:02:01) [GCC 7.3.1 20180712 (Red Hat 7.3.1-13)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pillow Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'pillow' >>> import PIL >>>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

kyokio

2022/05/10 14:35

エラー文を見たいです
nika_nika

2022/05/10 14:52 編集

ご質問ありがとうございます。 画像アップロード時のエラー文は、「Server Error (500)」の画面表示のみになります。 Apacheのエラーログを見ようとしたのですが、方法がわからず sudo less /var/log/httpd/error_log コマンドで 下記のログは、確認できたのですがあまり関係ないですよね。。 ``` mands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive. [Mon May 09 15:48:44.863861 2022] [mpm_prefork:notice] [pid 12778] AH00163: Apache/2.4.52 () mod_wsgi/4.9.0 Python/3.7 configured -- resuming normal operations [Mon May 09 15:48:44.863887 2022] [core:notice] [pid 12778] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' [Mon May 09 16:10:18.074586 2022] [mpm_prefork:notice] [pid 12778] AH00170: caught SIGWINCH, shutting down gracefully [Mon May 09 16:10:19.179849 2022] [suexec:notice] [pid 13038] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Mon May 09 16:10:19.207102 2022] [lbmethod_heartbeat:notice] [pid 13038] AH02282: No slotmem from mod_heartmonitor [Mon May 09 16:10:19.207148 2022] [http2:warn] [pid 13038] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive. [Mon May 09 16:10:19.211148 2022] [mpm_prefork:notice] [pid 13038] AH00163: Apache/2.4.53 () mod_wsgi/4.9.0 Python/3.7 configured -- resuming normal operations [Mon May 09 16:10:19.211170 2022] [core:notice] [pid 13038] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' [Tue May 10 00:33:51.467537 2022] [cgi:error] [pid 13040] [client 46.101.157.178:34400] AH02811: script not found or unable to stat: /var/www/cgi-bin/php ```
kyokio

2022/05/10 14:53

デバッグtrueにしてエラー内容をみてはいかがでしょうか?
nika_nika

2022/05/10 15:03 編集

デバッグtrueでエラー分がでることを知っておりませんでした。ありがとうございます! ModuleNotFoundError at /admin/staff/edit/2 No module named 'PIL' 上記のエラーが出ました。 pillow インストールしていたかと思ったのですが、確認してみます。 Pillow : 9.1.0はインストールされていました。
nika_nika

2022/05/10 15:13

実行時のpythonバージョンが異なっていることによるエラーなのでしょうか。
kyokio

2022/05/10 15:17

pipで入れました? pipとDjangoを実行しているpythonは同じですか?
nika_nika

2022/05/10 15:30

pipでPillowをインストールしました。 Pillowの保存先は/home/ec2-user/.local/lib/python3.7/site-packages で pythonのバージョンを確認すると python3 --versionコマンドで Python 3.7.10 と表示されました。 本番環境でのpipとDjangoの実行しているpythonは上記の確認で同じかなと判断しているのですがいかがでしょうか。 本題の質問で環境python3.9と記述しているのは、自身のPC環境を記述していたみたいでした。すみません。
kyokio

2022/05/11 07:26

本番環境のOSはmacなんですか? pip list Djangoのバージョンは幾つですか?
nika_nika

2022/05/11 13:12

失礼しました。Linuxになります。 pip list Djangoのバージョンは3.2.12になります。
kyokio

2022/05/11 14:16 編集

path関係でないなら今の情報ではわからないです。 もし、github等にコードが公開しているなら検証しますが、、、 あと、下記サイトにpillowとPILは共存できないと書いてあるので確認してみてはいかがでしょうか https://note.nkmk.me/python-pillow-basic/
nika_nika

2022/05/11 14:20

色々考えてくれて誠にありがとうございます。 こちら、業務で使用しておりプライベート環境のため共有ができないです。 ありがとうございます。 参考サイト拝見いたします! 何か変化あれば追記いたします!!

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。