Skip to content

Instantly share code, notes, and snippets.

@ohtsuchi
Last active September 25, 2023 05:44
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ohtsuchi/ab690bb6bd7b054e65516d972e5e2f65 to your computer and use it in GitHub Desktop.
Save ohtsuchi/ab690bb6bd7b054e65516d972e5e2f65 to your computer and use it in GitHub Desktop.

DjangoのTutorialをやる前にワークショップ メモ

説明

前提

  • 以下がインストール済みであること
    1. Git
    2. Python(version3系)
      • 自分の場合は homebrew で インストールしました (brew install python3)
    3. PyCharm Community

python3 インストール後のバージョン確認

% python3 --version
Python 3.7.2

% which python3
/usr/local/bin/python3

環境構築手順

1. (PyCharm の) Project を新規作成

  • PyCharm 起動
  • + Create New Project を選択

2. New Project ダイアログの設定

  • Location 変更
    • 自分の場合は /Users/<ユーザ名>/test に変更しました
      • (PyCharm の) Project 名: test
      • 親ディレクトリ: ホームディレクトリ(/Users/<ユーザ名>/)
  • ▶ Project interpreter: New Virtualenv environment の ▶ をクリック
    • New environment using チェック が選択された状態
      • Virtualenv が選択された状態
    • Base interpreter を変更
      • python3 の ディレクトリ を選択(自分の場合は /usr/local/bin/python3 を選択しました)

3. PyCharm 起動 && (PyCharm の) Project 確認

  • venv ディレクトリが作成されている事を確認

4. Preferences

  • Command + カンマ(,) を同時に押して Preferences を表示

4-1. Project Interpreter

  • Preferences 左上のテキストボックスに inter と入力
    • Project: xxx - Project Interpreter 選択
      • ボタン 選択

4-2. Available Packages

  • Available Packages ダイアログ

  • 上のテキストボックスに Django と入力 → Django 選択
  • Specify version には Django の最新バージョン(今回の例では 2.2.2)が選択済み
  • Install Package ボタン を押してインストール開始
  • インストール終了後, Available Packages ダイアログ の 左上の × を押して閉じる

  • Preferences の Project Interpreter に戻って Django がインストールされた事を確認
  • OK ボタンで閉じる

5. .gitignore ファイル 新規追加

  • Project のルート(今回の場合は test) ディレクトリ を選択
  • Command + N を同時に押して File を選択
  • ファイル名を入力するダイアログ -> .gitignore と入力

5-1. github/gitignore の内容をコピー

5-2. .gitignore 追記

  • .gitignore に 以下の内容を追記
# macOS + PyCharm
.DS_Store
.idea
.idea/

6. git 初期化

6-1. Terminal 起動

  • PyCharm 画面下部 Terminal を選択して 起動
  • (venv) と表示されている事を確認
    • -> virtualenv (仮想環境) が実行されている

6-2. git コマンド実行

  • Terminal 内で以下のコマンドを実行
(venv) $ git init
(venv) $ git config --global user.name "Your Name"
(venv) $ git config --global user.email you@example.com
(venv) $ git add .
(venv) $ git commit -m "initial commit"

7. startproject

(venv) $ django-admin startproject config .
  • django-admin コマンド実行
    • 第1引数
      • startproject
    • 第2引数
      • config
        • Python パッケージの名前 となる
          • 例えば settings.py(自動作成される) の中の ROOT_URLCONF = 'config.urls' という1行 で呼ばれている
        • Django Girls Tutorial では
          • mysite (=Project 名) という名前で指定
        • akiyoko さんの書籍 で紹介 されているディレクトリ構成:
          • config という名前で指定
    • 第3引数
      • .
        • 現在の作業ディレクトリ 直下にコード(manage.py など)が自動生成される

作成されたディレクトリ/ファイル

test
├── config
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

8. static, templates ディレクトリ作成

(venv) $ mkdir static
(venv) $ mkdir templates
test
├── config
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── static                  # 新規作成
└── templates               # 新規作成

9. config の中に 新パッケージ(settings) 作成

  • 新規ディレクトリ(settings) 作成
(venv) $ mkdir config/settings
  • __init__.py ファイル 新規作成
    • 中身は空で良い
(venv) $ touch config/settings/__init__.py
test
├── config
│   ├── __init__.py
│   ├── settings            # 新規作成
│   │   └── __init__.py     # 新規作成
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── static
└── templates

10. config/settings.pybase.py に rename して config/settings ディレクトリに移動

(venv) $ mv config/settings.py config/settings/base.py
test
├── config
│   ├── __init__.py
│   ├── settings
│   │   ├── __init__.py
│   │   └── base.py         # rename && 移動
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── static
└── templates

11. ローカル開発環境用, デプロイ先環境用 の settings.py (=pycharm.py,deploy.py) を新規作成

(venv) $ touch config/settings/pycharm.py
(venv) $ touch config/settings/deploy.py
test
├── config
│   ├── __init__.py
│   ├── settings
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── deploy.py       # 新規作成
│   │   └── pycharm.py      # 新規作成
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── static
└── templates

12. 共通用の settings.py (=base.py) を編集

12-1. BASE_DIR を変更

  • BASE_DIR の行を変更
  • os.path.dirname のネストを追加

config/settings/base.py の差分

-BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

(解説)

  • (1) os.path.abspath(__file__)
    • base.py の 絶対パス が返る
      • 今回の例では /Users/<ユーザ名>/test/config/settings/base.py
  • (2) os.path.dirname(os.path.abspath(__file__))
    • (1) の パスから 末尾のファイル名 を抜いたパス が返る
      • 今回の例では /Users/<ユーザ名>/test/config/settings
  • (3) os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    • (2) の パスから 末尾のディレクトリ名 を抜いたパス が返る
      • 今回の例では /Users/<ユーザ名>/test/config
  • (4) os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    • (3) の パスから 末尾のディレクトリ名 を抜いたパス が返る
      • 今回の例では /Users/<ユーザ名>/test

12-2. PROJECT_NAME 追加

  • BASE_DIR の1行下に PROJECT_NAME を1行追加

config/settings/base.py の差分

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+PROJECT_NAME = os.path.basename(BASE_DIR)

(解説)

  • <1> BASE_DIR
    • 上記(4) の説明のとおり、今回の例では /Users/<ユーザ名>/test
  • <2> os.path.basename(BASE_DIR)
    • <1> の パスから 末尾のディレクトリ名 だけ が返る
      • 今回の例では test

13. ローカル開発環境用, デプロイ先環境用 の settings.py (=pycharm.py,deploy.py) を編集

13-1. base.py を import

config/settings/pycharm.py の差分

+from .base import *

config/settings/deploy.py の差分

+from .base import *

13-2. SECRET_KEY, DEBUG, ALLOWED_HOSTSpycharm.py,deploy.py に移動

config/settings/base.py の差分

PROJECT_NAME = os.path.basename(BASE_DIR)


-# 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 = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
-
-# SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
-
-ALLOWED_HOSTS = []
-
-
# Application definition

config/settings/pycharm.py の差分

from .base import *
+
+# 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 = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+

config/settings/deploy.py の差分

from .base import *
+
+# 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 = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+

14. ALLOWED_HOSTS を変更

14-1. ローカル開発環境用 の ALLOWED_HOSTS を変更

  • pycharm.py (ローカル開発環境用) の ALLOWED_HOSTSワイルドカード を指定

config/settings/pycharm.py の差分

-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ['*']

14-2. デプロイ先環境用 の ALLOWED_HOSTS を変更[] のままで良い

config/settings/deploy.py 確認

ALLOWED_HOSTS = []

上記の内容のままで良い

14-2-1. 補足: デプロイ先環境( PythonAnywhere ) の 設定の置換/追記 ロジック について

~/.local/bin/pa_autoconfigure_django.py から抜粋

from pythonanywhere.django_project import DjangoProject
# ※中略

def main(repo_url, domain, python_version, nuke):
    # ※中略

    project = DjangoProject(domain, python_version)
    # ※中略
    project.run_collectstatic()
    project.run_migrate()
    project.webapp.reload()
    print(snakesay('All done!  Your site is now live at https://{domain}'.format(domain=domain)))
    print()
    project.start_bash()
# ※以下略

~/.local/lib/python3.6/site-packages/pythonanywhere/django_project.py から抜粋

    def find_django_files(self):
        try:
            #self.settings_path = next(self.project_path.glob('**/settings.py'))            # デフォルトの定義(このままだとエラーになる)
            self.settings_path = next(self.project_path.glob('config/settings/deploy.py'))  # 手動で修正
        except StopIteration:
            raise SanityException('Could not find your settings.py')
        try:
            self.manage_py_path = next(self.project_path.glob('**/manage.py'))
        except StopIteration:
            raise SanityException('Could not find your manage.py')
    
    
    def update_settings_file(self):
        print(snakesay('Updating settings.py'))
    
        with self.settings_path.open() as f:
            settings = f.read()
        new_settings = settings.replace(
            'ALLOWED_HOSTS = []',
            'ALLOWED_HOSTS = [{domain!r}]'.format(domain=self.domain)
        )
        new_settings += dedent(
            """
            MEDIA_URL = '/media/'
            STATIC_ROOT = os.path.join(BASE_DIR, 'static')
            MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
            """
        )
        with self.settings_path.open('w') as f:
            f.write(new_settings)
  • settings.py(後の手順 24-4-1. で deploy.py に変更) の中の
    • ALLOWED_HOSTS = []
    • ALLOWED_HOSTS = [<web app の domain>] に置換するロジックが記述されている
      • 補足: {domain!r}!rr は 「conversion フィールド」を示す
      • 置換後の deploy.py の 該当行の中身 -> ALLOWED_HOSTS = ['<ユーザ名>.pythonanywhere.com']
  • よって、 ALLOWED_HOSTS = [] のままで良い

15. デプロイ先環境用 の DEBUG を変更

  • DEBUGFalse に変更

config/settings/deploy.py の差分

-DEBUG = True
+DEBUG = False

16. TEMPLATES パス設定 追加

  • akiyoko さんの書籍 で紹介 されている TEMPLATES 構成 にするために、
  • TEMPLATES 内の 'DIRS' を設定
  • BASE_DIR/templates 」ディレクトリ を指定
    • BASE_DIR: 上記 (12-1.) で設定
      • 今回の例では /Users/<ユーザ名>/test
    • templates ディレクトリ: 上記 (8.) で 新規作成

config/settings/base.py の差分

 TEMPLATES = [
     {
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
-        'DIRS': [],
+        'DIRS': [os.path.join(BASE_DIR, 'templates')],
         'APP_DIRS': True,
         'OPTIONS': {
             'context_processors': [

16-1. 参考サイト

Django、テンプレートファイルの探索順序について

最初に探索されるのが、このDIRSに指定したパスです。空だった場合は探索されません。

例えば'DIRS': [os.path.join(BASE_DIR, 'templates')]とした場合... これはプロジェクト直下、manage.pyと同じ階層のtemplatesディレクトリを表しますが、 そこが真っ先に探索されます。

'APP_DIRS': Trueとしていた場合は、 DIRSパスの次にアプリケーションディレクトリ内のtemplatesが探索されるようになります。

16-2. (参考) Django Girls Tutorial の TEMPLATES 構成

  • DIRS の指定はデフォルト(=[])のまま、変更無し
  • BASE_DIR(12-1. で設定) 直下の
    • application(=blog) ディレクトリ 配下の
      • templates ディレクトリ 配下の
        • application と同名(=blog) ディレクトリ 配下に
          • テンプレートファイル(html) を配置する
test
├── blog
│   ├── __init__.py
│   (※中略)
│   ├── templates
│   │   └── blog               # テンプレートファイル(`html`) の配置場所
│   │       ├── post_list.html
│   │       └── xxxxx.html
│   (※中略)
├── config
│   ├── __init__.py
│   (※中略)
├── manage.py
(※以下略)

16-3. akiyoko さんの書籍 で紹介 されている TEMPLATES 構成

  • BASE_DIR(12-1. で設定) 直下の
    • templates ディレクトリ 配下の
      • application と同名(=blog) ディレクトリ 配下に
        • テンプレートファイル(html) を配置する
test
├── blog
│   ├── __init__.py
│   (※中略)
├── config
│   ├── __init__.py
│   (※中略)
├── manage.py
├── static
└── templates                  # テンプレートファイル(`html`) の配置場所
    └── blog
        ├── post_list.html
        └── xxxxx.html

17. 静的ファイル の パス設定 追加

17-1. 補足: デプロイ先環境( PythonAnywhere ) の 設定の置換/追記 ロジック について

  • 上記 (14-2-1. 補足) で記述した通り、
  • デプロイ先環境( PythonAnywhere ) の コンソールから
  • ヘルパー( pa_autoconfigure_django.py ) を実行 する
  • その際, settings.py(後の手順 24-4-1. で deploy.py に変更) に 以下の内容が追記 される
            """
            MEDIA_URL = '/media/'
            STATIC_ROOT = os.path.join(BASE_DIR, 'static')
            MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
            """
  • よって STATIC_ROOT を設定する必要は無い
  • そして STATICFILES_DIRSos.path.join(BASE_DIR, 'static') を設定(下記 17-2.)していると、
    • STATICFILES_DIRS = STATIC_ROOT が一致してしまって
    • (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting. エラーが発生する
  • よって STATICFILES_DIRS の設定は pycharm.py (ローカル開発環境用) のみに設定して, デプロイ先環境 では設定しない

17-2. STATICFILES_DIRS パス設定 追加

config/settings/base.py の差分
config/settings/pycharm.py の差分

ALLOWED_HOSTS = ['*']

+STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
  • 16 の TEMPLATES と同様、
  • BASE_DIR(12-1. で設定) 直下の
    • static ディレクトリ 配下に
      • 静的ファイル(*.css, *.js, favicon など) を配置する
test
├── blog
│   ├── __init__.py
│   (※中略)
├── config
│   ├── __init__.py
│   (※中略)
├── manage.py
├── static                     # 静的ファイル の配置場所
│   └── css
│       └── blog.css
└── templates
    └── blog
        ├── post_list.html
        └── xxxxx.html

17-3. STATIC_ROOT パス設定 追加 → 追加しなくて良い

  • 上記 (17-1. 補足) 参照

17-3-1. 参考サイト

python - DjangoにおけるSTATIC_ROOT,STATICFILES_DIRS, STATIC_URLの違いとは - スタック・オーバーフロー

STATIC_ROOT

デプロイ先環境でのみ利用される。nginxで静的ファイルを配信したい場合など。manage.py collectstaticによって静的ファイルがここにコピーされる。


18. LANGUAGE_CODE, TIME_ZONE 設定 変更

  • 英語→日本語、協定世界時→日本標準時 に変更

config/settings/base.py の差分

 # Internationalization
 # https://docs.djangoproject.com/en/2.2/topics/i18n/
 
-LANGUAGE_CODE = 'en-us'
+LANGUAGE_CODE = 'ja-JP'
 
-TIME_ZONE = 'UTC'
+TIME_ZONE = 'Asia/Tokyo'
 
 USE_I18N = True

19. DJANGO_SETTINGS_MODULE 設定 変更

  • manage.py, wsgi.py から呼び出すファイルの指定を変更
    • 変更前: config パッケージ の settings.py
    • 変更後: config/settings パッケージ の deploy.py (デプロイ先環境用)
test
├── config
│   ├── __init__.py
│   ├── settings
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── deploy.py       # デフォルトで このファイルが呼ばれるように
│   │   └── pycharm.py
│   ├── urls.py
│   └── wsgi.py             # デフォルトで deploy.py を呼ぶように
├── manage.py               # デフォルトで deploy.py を呼ぶように
├── static
└── templates

19-1. config/wsgi.py 編集

config/wsgi.py の差分

 from django.core.wsgi import get_wsgi_application
 
-os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.deploy')
 
 application = get_wsgi_application()

19-2. manage.py 編集

manage.py の差分

 def main():
-    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
+    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.deploy')
     try:
         from django.core.management import execute_from_command_line
     except ImportError as exc:

19-2-1. python3 manage.py コマンド を ローカル開発環境 で実行する際の注意

  • 上記 (19-2.) の設定変更で、
  • python3 manage.py コマンド を実行すると
    • deploy.py (デプロイ先環境用) の方をデフォルトで読み込むため、
  • ローカル開発環境 で実行する際は
    • --settings オプション を付けて
    • pycharm.py (ローカル開発環境用) を指定する
      • 以下 (21.) 参照

20. DATABASES 設定 の確認

  • デフォルトで DB に sqlite3 が指定されている
  • DB の場所は BASE_DIR (12-1. で設定) 直下に db.sqlite3 という名前の ファイル が作成される
    • 上記 5. で追加した .gitignoredb.sqlite3 が含まれているため、コミット対象外

config/settings/base.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
  • デプロイ先環境 ( PythonAnywhere ) でも sqlite3 を使用するため base.py (共通用) に定義

21. 管理用 テーブル作成

21-1. migrate 実行

  • python3 manage.py migrate 実行
  • 上記 19-2. の設定変更で deploy.py (デプロイ先環境用) の方をデフォルトで読み込むため、
    • --settings オプション を付けて
    • pycharm.py (ローカル開発環境用) を指定する
(venv) $ python3 manage.py migrate --settings config.settings.pycharm

(実行結果)

% python3 manage.py migrate --settings config.settings.pycharm
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

21-2. 作成された db.sqlite3 ファイル確認

  • ls -l db* 実行
(venv) $ ls -l db*

(実行結果)

% ls -l db*
-rw-r--r-- 1 xxxxxxxx staff 131072  6 14 14:40 db.sqlite3

21-3. DB 接続 (dbshell)

  • python3 manage.py dbshell 実行
  • 上記 19-2. の設定変更で deploy.py (デプロイ先環境用) の方をデフォルトで読み込むため、
    • --settings オプション を付けて
    • pycharm.py (ローカル開発環境用) を指定する
(venv) $ python3 manage.py dbshell --settings config.settings.pycharm

21-4. 作成されたテーブル確認 (.table)

  • .table 実行
sqlite> .table

(実行結果)

sqlite> .table
auth_group                  auth_user_user_permissions
auth_group_permissions      django_admin_log          
auth_permission             django_content_type       
auth_user                   django_migrations         
auth_user_groups            django_session   
  • .exit で終了
qlite> .exit

22. superuser 作成

  • python3 manage.py createsuperuser 実行
  • 上記 19-2. の設定変更で deploy.py (デプロイ先環境用) の方をデフォルトで読み込むため、
    • --settings オプション を付けて
    • pycharm.py (ローカル開発環境用) を指定する
  • ここでは ユーザ名=admin, メール=admin@admin.com, パスワード=admin で登録する
    • パスワードが「ユーザー名 と似すぎ && 短い && 一般的」の警告文が出るが y を入力すれば登録できる
(venv) $ python3 manage.py createsuperuser --settings config.settings.pycharm

(実行結果)

% python3 manage.py createsuperuser --settings config.settings.pycharm
ユーザー名 (leave blank to use 'xxxxxxxx'): admin
メールアドレス: admin@admin.com
Password: 
Password (again): 
このパスワードは ユーザー名 と似すぎています。
このパスワードは短すぎます。最低 8 文字以上必要です。
このパスワードは一般的すぎます。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

23. サーバ起動

  • python3 manage.py runserver 実行
  • 上記 19-2. の設定変更で deploy.py (デプロイ先環境用) の方をデフォルトで読み込むため、
    • --settings オプション を付けて
    • pycharm.py (ローカル開発環境用) を指定する
(venv) $ python3 manage.py runserver --settings config.settings.pycharm

23-1. トップ画面 にアクセス

  • http://127.0.0.1:8000/ にアクセス
    • 「インストールは成功しました!おめでとうございます!」という画面 が表示されれば OK

23-2. 管理サイト にアクセス

  • http://127.0.0.1:8000/admin にアクセス
    • ユーザ名=admin, パスワード=admin 上記(22.)で作成した superuser の設定でログイン
      • Django 管理サイト が表示されれば OK

24-1. 注意事項(1) config 構成が異なる

以下のディレクトリ/ファイル構成が Tutorial とは異なるため、置き換えながら進める

  • mysite/config/
  • mysite/settings.pyconfig/settings/base.py, config/settings/pycharm.py, config/settings/deploy.py

24-2. 注意事項(2) テンプレートファイル, 静的ファイル の置き場所 が異なる

  • => (16. TEMPLATES パス設定 追加), (17. 静的ファイルの パス設定 追加) 参照

24-3. 注意事項(3) ローカル開発環境で manage.py 実行時に --settings オプションを付ける

  • ローカル開発環境で python3 manage.py xxx コマンドを実行する際は、
  • 上記 19-2. の設定変更で deploy.py (デプロイ先環境用) の方をデフォルトで読み込むため、
    • --settings オプション を付けて
    • pycharm.py (ローカル開発環境用) を指定する

(実行例)

(venv) $ python3 manage.py startapp blog --settings config.settings.pycharm
(venv) $ python3 manage.py makemigrations blog --settings config.settings.pycharm
(venv) $ python3 manage.py migrate blog --settings config.settings.pycharm
(venv) $ python3 manage.py shell --settings config.settings.pycharm

24-4. 注意事項(4) デプロイ先環境( PythonAnywhere ) で エラーが発生する

24-4-1. Could not find your settings.py

  • 以下のエラー発生
  • 原因
    • xxx/settings.py から名前を変更したため → config/settings/deploy.py (デプロイ先環境用)
Traceback (most recent call last):
  File "/home/xxxxxxxx/.local/bin/pa_autoconfigure_django.py", line 52, in <module>
    main(arguments['<git-repo-url>'], arguments['--domain'], arguments['--python'], nuke=arguments.get('--nuke'))
  File "/home/xxxxxxxx/.local/bin/pa_autoconfigure_django.py", line 39, in main
    project.find_django_files()
  File "/home/xxxxxxxx/.local/lib/python3.6/site-packages/pythonanywhere/django_project.py", line 54, in find_django_files
    raise SanityException('Could not find your settings.py')
pythonanywhere.exceptions.SanityException: Could not find your settings.py
  • django_project.py を編集 する
$ vim ~/.local/lib/python3.6/site-packages/pythonanywhere/django_project.py
 def find_django_files(self):
     try:
-        self.settings_path = next(self.project_path.glob('**/settings.py'))
+        self.settings_path = next(self.project_path.glob('config/settings/deploy.py'))
     except StopIteration:
         raise SanityException('Could not find your settings.py')
  • 改めて --nuke オプション付きで pa_autoconfigure_django.py を実行
$ pa_autoconfigure_django.py --nuke https://github.com/xxxxxxxxx/my-first-blog.git
  • 今度は別のエラー発生

24-4-2. No such file or directory '/home/xxxxxxxx/xxxxxxxx.pythonanywhere.com/static'

  • 以下のエラー発生
  • 原因
    • pa_autoconfigure_django.py 中で collectstatic が実行された時に
    • STATIC_ROOT で指定された ディレクトリ(BASE_DIR/static)が存在しない ため
      • 上記 (14-2-1. 補足) 参照
FileNotFoundError: [Errno 2] No such file or directory: '/home/xxxxxxxx/xxxxxxxx.pythonanywhere.com/static'
Traceback (most recent call last):
  File "/home/xxxxxxxx/.local/bin/pa_autoconfigure_django.py", line 52, in <module>
    main(arguments['<git-repo-url>'], arguments['--domain'], arguments['--python'], nuke=arguments.get('--nuke'))
  File "/home/xxxxxxxx/.local/bin/pa_autoconfigure_django.py", line 42, in main
    project.run_collectstatic()
  File "/home/xxxxxxxx/.local/lib/python3.6/site-packages/pythonanywhere/django_project.py", line 88, in run_collectstatic
    '--noinput',
  File "/usr/lib/python3.6/subprocess.py", line 291, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/home/xxxxxxxx/.virtualenvs/xxxxxxxx.pythonanywhere.com/bin/python', '/home/xxxxxxxx/xxxxxxxx.pythonanywhere.com/manage.py', 'collectstatic', 
'--noinput']' returned non-zero exit status 1.
  • ディレクトリ確認
  • この時点ではまだ css が追加されておらず、空ディレクトリで github に push されていない
$ ls -l xxxxxxxx.pythonanywhere.com/
total 12
drwxrwxr-x 4 xxxxxxxx registered_users 4096 Jun 14 13:27 blog
drwxrwxr-x 4 xxxxxxxx registered_users 4096 Jun 14 13:27 config
-rwxrwxr-x 1 xxxxxxxx registered_users  633 Jun 14 13:23 manage.py
  • static/ ディレクトリに 空ファイル(.gitkeep) を add して github に push してから
(venv) $ touch static/.gitkeep
(venv) $ git add .
(venv) $ git commit -m "add empty file to static/"
(venv) $ git push
  • PythonAnywhere のコンソールに戻って
  • 改めて --nuke オプション付きで pa_autoconfigure_django.py を実行
$ pa_autoconfigure_django.py --nuke https://github.com/xxxxxxxxx/my-first-blog.git
  • 起動が成功 する
< Adding static files mappings for /static/ and /media/ >
   \
    ~<:>>>>>>>>>
< Updating wsgi file at /var/www/ohtsuchi_pythonanywhere_com_wsgi.py >
   \
    ~<:>>>>>>>>>
< Updating settings.py >
   \
    ~<:>>>>>>>>>
< Running collectstatic >
   \
    ~<:>>>>>>>>>
\                                     /
  -----------------------------------
   \
    ~<:>>>>>>>>>
  ___________________________________________________________________
/                                                                     \
| Starting Bash shell with activated virtualenv in project directory. |
| Press Ctrl+D to exit.                                               |
\                                                                     /
  -------------------------------------------------------------------
   \
    ~<:>>>>>>>>>
  • しかし http://<ユーザ名>.pythonanywhere.com/ にアクセスすると エラー表示
    • Something went wrong :-(


24-4-3. Error running WSGI application - ImportError: No module named 'settings.settings'

  • Dashboard - Web リンク

  • Log files: - Error log: のリンク

  • エラーログ内容
2019-06-15 07:35:16,322: Error running WSGI application
2019-06-15 07:35:16,328: ImportError: No module named 'settings.settings'
2019-06-15 07:35:16,328:   File "/var/www/xxxxxxxx_pythonanywhere_com_wsgi.py", line 15, in <module>
※以下略
  • 原因
    • pythonanywhere で用意している wsgi.py のテンプレートxxx/settings.py を設定 する前提であるのに、
    • xxx/settings.py から名前を変更したため → config/settings/deploy.py (デプロイ先環境用)

~/.local/lib/python3.6/site-packages/pythonanywhere/django_project.py から抜粋

    def find_django_files(self):
        try:
            #self.settings_path = next(self.project_path.glob('**/settings.py'))            # デフォルトの定義(このままだとエラーになる)
            self.settings_path = next(self.project_path.glob('config/settings/deploy.py'))  # 手動で修正
        except StopIteration:
# ※中略

    def update_wsgi_file(self):
        print(snakesay('Updating wsgi file at {wsgi_file_path}'.format(wsgi_file_path=self.wsgi_file_path)))
        template = (Path(__file__).parent / 'wsgi_file_template.py').open().read()
        with self.wsgi_file_path.open('w') as f:
            f.write(template.format(project=self))
  • wsgi_file_template.py を編集 する
$ vim ~/.local/lib/python3.6/site-packages/pythonanywhere/wsgi_file_template.py

~/.local/lib/python3.6/site-packages/pythonanywhere/wsgi_file_template.py の差分

 # Add your project directory to the sys.path
-settings_path = '{project.settings_path.parent.parent}'
+settings_path = '{project.settings_path.parent.parent.parent}'
 sys.path.insert(0, settings_path)
 
 # Set environment variable to tell django where your settings.py is
-os.environ['DJANGO_SETTINGS_MODULE'] = '{project.settings_path.parent.name}.settings'
+os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings.deploy'
  • PythonAnywhere のコンソール で Ctrl + D キーを押して virtualenv から抜け出して
  • 改めて --nuke オプション付きで pa_autoconfigure_django.py を実行
$ pa_autoconfigure_django.py --nuke https://github.com/xxxxxxxxx/my-first-blog.git
  • 以下が表示されれば OK
    • http://<ユーザ名>.pythonanywhere.com/ にアクセスすると Not Found
    • http://<ユーザ名>.pythonanywhere.com/admin にアクセスすると 管理サイト
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment