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

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

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

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Amazon EC2

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

1回答

2917閲覧

Djangoの本番運用環境で配信用の静的ファイルをディレクトリに配置しようとするとエラーが発生する。(python manege.py collectstaicコマンドでエラー発生)

peacesgallery

総合スコア4

Django

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Amazon EC2

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2020/09/13 09:38

編集2020/09/15 02:43

Djangoの本番運用環境で配信用の静的ファイルをディレクトリに配置しようとするとエラーが発生する。(python manege.py collectstaicコマンドでエラー発生)

「動かして学ぶ!PythonDjango開発入門」という書籍を参考に進めています。

AWSのEC2インスタンスにSSH接続している状態で、Nginx管轄の公開ディレクトリにDjangoのプロジェクトディレクトリにある静的ファイルをコピーしたいのですが、以下のようにエラーが発生し行き詰まっています。

EC2インスタンスにSSH接続

$ ssh EC2_app_admin

静的ファイルを配置するディレクトリを以下のコマンドを実行して作成後、配置ディレクトリの所有者を変更。

$ sudo mkdir -p /usr/share/nginx/html/static $ sudo mkdir /usr/share/nginx/html/media $ sudo chown app_admin /usr/share/nginx/html/static $ sudo chown app_admin /usr/share/nginx/html/media

Python仮想環境に入り、manage.pyがあるディレクトリに移動。続いてcollectstaticコマンドを実行

$ source ~/venv_private_diary/bin/activate $ cd ~/venv_private_diary/private_diary $ python manage.py collectstatic

すると以下のようにエラーが発生します。

Traceback (most recent call last): File "manage.py", line 21, in <module> main() File "manage.py", line 17, in main execute_from_command_line(sys.argv) File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, **options) File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 188, in handle collected = self.collect() File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 114, in collect handler(path, prefixed_path, storage) File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 342, in copy_file if not self.delete_file(path, prefixed_path, source_storage): File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 249, in delete_file if self.storage.exists(prefixed_path): File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/core/files/storage.py", line 310, in exists return os.path.exists(self.path(name)) File "/home/app_admin/venv_private_diary/lib64/python3.7/site-packages/django/contrib/staticfiles/storage.py", line 44, in path raise ImproperlyConfigured("You're using the staticfiles app " django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.

settings.pyは以下のように設定しています。

from .settings_common import * # デバックモードを有効にするかどうか(本番環境では必ずFalseにする) DEBUG = False # 許可するホスト名のリスト ALLOWED_HOSTS = [os.environ.get('ALLOWED_HOSTS')] # 静的ファイルを配置する場所 STATIC_ROOT = '/usr/share/nginx/html/static' MEDIA_ROOT = '/usr/share/nginx/html/media' # Amazon SES関連設定 AWS_SES_ACCESS_KEY_ID = os.environ.get('AWS_SES_ACCESS_KEY_ID') AWS_SES_SECRET_ACCESS_KEY = os.environ.get('AWS_SES_SECRET_ACCESS_KEY') EMAIL_BACKEND = 'django_ses.SESBackend' # ロギング LOGGING = { 'version': 1, 'disable_existing_loggers': False, # ロガーの設定 'loggers': { # Djangoが利用するロガー 'django': { 'handlers': ['file'], 'level': 'INFO', }, # diaryアプリケーションが利用するロガー 'diary': { 'handlers': ['file'], 'level': 'INFO', }, }, # ハンドラの設定 'handlers': { 'file': { 'level': 'INFO', 'class': 'logging.handlers.TimedRotatingFileHandler', 'filename': os.path.join(BASE_DIR, 'logs/django.log'), 'formatter': 'prod', 'when': 'D', # ログローテーション(新しいファイルへの切り替え)間隔の単位(D=日) 'interval': 1, # ログローテーション間隔(一日単位) 'backupCount': 7, # 保存しておくログファイル数 }, }, # フォーマッタの設定 'formatters': { 'prod': { 'format': '\t'.join([ '%(asctime)s', '[%(levelname)s]', '%(pathname)s(Line:%(lineno)d)', '%(message)s' ]) }, } }

settings_common.pyは以下のように設定しています。

""" Django settings for private_diary project. Generated by 'django-admin startproject' using Django 2.2.2. For more information on this file, see https://docs.djangoproject.com/en/2.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/2.2/ref/settings/ """ from django.contrib.messages import constants as messages import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'kobxonc)5vx3ix4mu2%#6y&bqx8wx8#5)z75)f3r3ow#llxj25' # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'diary.apps.DiaryConfig', 'accounts.apps.AccountsConfig', 'django.contrib.sites', 'allauth', 'allauth.account', 'django_ses', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'private_diary.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'private_diary.wsgi.application' # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'private_diary', 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': '', 'PORT': '', } } # Password validation # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/2.2/topics/i18n/ LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) # 画像を配信するURLのホスト名以下のルートURLに使用 MEDIA_URL = '/media/' MESSAGE_TAGS = { messages.ERROR: 'alert alert-danger', messages.WARNING: 'alert alert-warning', messages.SUCCESS: 'alert alert-success', messages.INFO: 'alert alert-info', } AUTH_USER_MODEL = 'accounts.CustomUser' SITE_ID = 1 AUTHENTICATION_BACKENDS = ( 'allauth.account.auth_backends.AuthenticationBackend', 'django.contrib.auth.backends.ModelBackend', ) ACCOUNT_AUTHENTICATION_METHOD = 'email' ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_EMAIL_VERIFICATION = 'mandatory' ACCOUNT_EMAIL_REQUIRED = True LOGIN_REDIRECT_URL = 'diary:diary_list' ACCOUNT_LOGOUT_REDIRECT_URL = 'account_login' ACCOUNT_LOGOUT_ON_GET = True ACCOUNT_EMAIL_SUBJECT_PREFIX = '' DEFAULT_FROM_EMAIL = 'admin@example.com' # バックアップバッチ用 BACKUP_PATH = 'backup/' NUM_SAVED_BACKUP = 30

対処法があれば教えて頂けると嬉しいです。よろしくお願いします。

<追記>

settingファイルとstaticファイルの位置関係はこのようになってます。

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

llr114

2020/09/14 02:20

ディレクトリの構成を教えて頂いてもいいですか? 主に、setting.pyとstaticフォルダの位置関係が知りたいです。
peacesgallery

2020/09/15 02:45

質問内容に位置関係を追加してるので、ご確認頂けると嬉しいです。
guest

回答1

0

下記のように実行したらどうなりますか。

bash

1python manage.py collectstatic --settings=private_diary.settings

投稿2020/09/18 01:29

hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

peacesgallery

2020/09/18 04:04

試してみましたが、同じようにエラーが出ました。
hasami

2020/09/18 07:43

外しました。すみません。 STATIC_ROOTが設定してある、settings.pyを指定すればOKかと思ったのですが・・・。
_whitecat_22

2020/11/23 02:09

ありがとうございます。 私も同じエラーで引っかかっていたのですが、hasamiさんの回答内容で解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問