- DjangoのTutorialをやる前にワークショップ (2019/06/11) に参加した時に教えてもらった内容のメモ
- Django Girls Tutorial を始める前 に必要な環境設定
- PyCharm による開発環境の構築
settings.py
の設定- ローカル開発環境用, デプロイ先環境用 でファイルを分割
pycharm.py
(ローカル開発環境用)deploy.py
(デプロイ先環境用)- Django Girls Tutorial では PythonAnywhere にデプロイする
- => デプロイ! · Django Girls Tutorial 参照
- ただし Tutorial 通りに進めると
settings.py
から名前を変更した事が原因によるエラーが発生する- => 手順 24-4. に対応内容を記述
- アプリ実行前に
MEDIA_URL
,STATIC_ROOT
,MEDIA_ROOT
が自動で追記される- => (17-1. 補足) 参照
- Django Girls Tutorial では PythonAnywhere にデプロイする
- ローカル開発環境用, デプロイ先環境用 でファイルを分割
- akiyoko さんの書籍 で紹介 されているディレクトリ構成
/config
/templates
/static
- 以下がインストール済みであること
- Git
- Python(version3系)
- 自分の場合は homebrew で インストールしました (
brew install python3
)
- 自分の場合は homebrew で インストールしました (
- PyCharm Community
python3
インストール後のバージョン確認
% python3 --version
Python 3.7.2
% which python3
/usr/local/bin/python3
- PyCharm 起動
+ Create New Project
を選択
Location
変更- 自分の場合は
/Users/<ユーザ名>/test
に変更しました- (PyCharm の) Project 名:
test
- 親ディレクトリ: ホームディレクトリ(
/Users/<ユーザ名>/
)
- (PyCharm の) Project 名:
- 自分の場合は
▶ Project interpreter: New Virtualenv environment
の ▶ をクリックNew environment using
チェック が選択された状態Virtualenv
が選択された状態
Base interpreter
を変更python3 の ディレクトリ
を選択(自分の場合は/usr/local/bin/python3
を選択しました)
venv
ディレクトリが作成されている事を確認
Command + カンマ(,)
を同時に押して Preferences を表示
- Preferences 左上のテキストボックスに
inter
と入力- →
Project: xxx
-Project Interpreter
選択+
ボタン 選択
- →
- Available Packages ダイアログ
- 上のテキストボックスに
Django
と入力 →Django
選択 Specify version
には Django の最新バージョン(今回の例では2.2.2
)が選択済みInstall Package
ボタン を押してインストール開始- インストール終了後, Available Packages ダイアログ の 左上の × を押して閉じる
- Preferences の Project Interpreter に戻って
Django
がインストールされた事を確認 OK
ボタンで閉じる
- Project のルート(今回の場合は
test
) ディレクトリ を選択 Command + N
を同時に押してFile
を選択- ファイル名を入力するダイアログ ->
.gitignore
と入力
5-1. github/gitignore の内容をコピー
- 作成した
.gitignore
の中身を編集 - https://github.com/github/gitignore/blob/master/Python.gitignore の内容をそのまま全てコピー
.gitignore
に 以下の内容を追記
# macOS + PyCharm
.DS_Store
.idea
.idea/
- PyCharm 画面下部
Terminal
を選択して 起動 (venv)
と表示されている事を確認- -> virtualenv (仮想環境) が実行されている
- 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"
(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
という名前で指定
- Python パッケージの名前 となる
- 第3引数
.
- 現在の作業ディレクトリ 直下にコード(
manage.py
など)が自動生成される
- 現在の作業ディレクトリ 直下にコード(
- 第1引数
作成されたディレクトリ/ファイル
test
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
(venv) $ mkdir static
(venv) $ mkdir templates
test
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── static # 新規作成
└── templates # 新規作成
- 新規ディレクトリ(
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
(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
(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
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
- 今回の例では
- (1) の パスから 末尾のファイル名 を抜いたパス が返る
- (3)
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- (2) の パスから 末尾のディレクトリ名 を抜いたパス が返る
- 今回の例では
/Users/<ユーザ名>/test/config
- 今回の例では
- (2) の パスから 末尾のディレクトリ名 を抜いたパス が返る
- (4)
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
- (3) の パスから 末尾のディレクトリ名 を抜いたパス が返る
- 今回の例では
/Users/<ユーザ名>/test
- 今回の例では
- (3) の パスから 末尾のディレクトリ名 を抜いたパス が返る
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
- 上記(4) の説明のとおり、今回の例では
- <2>
os.path.basename(BASE_DIR)
- <1> の パスから 末尾のディレクトリ名 だけ が返る
- 今回の例では
test
- 今回の例では
- <1> の パスから 末尾のディレクトリ名 だけ が返る
config/settings/pycharm.py
の差分
+from .base import *
config/settings/deploy.py
の差分
+from .base import *
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 = []
+
+
pycharm.py
(ローカル開発環境用) のALLOWED_HOSTS
に ワイルドカード を指定
config/settings/pycharm.py
の差分
-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ['*']
deploy.py
(デプロイ先環境用) のALLOWED_HOSTS
に.pythonanywhere.com
を指定=> プロジェクトを作成しよう! · Django Girls Tutorial 参照
config/settings/deploy.py
確認
ALLOWED_HOSTS = []
上記の内容のままで良い
14-2-1. 補足: デプロイ先環境( PythonAnywhere ) の 設定の置換/追記 ロジック について
- デプロイ! · Django Girls Tutorial で
- デプロイ先環境( PythonAnywhere ) の コンソールから
- ヘルパー(
pa_autoconfigure_django.py
) を実行 する
~/.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}
の!r
のr
は 「conversion
フィールド」を示す- 参考: string --- 一般的な文字列操作 — Python 3.7.3 ドキュメント
-
現在 3つの変換フラグがサポートされています: 値に対して str() を呼ぶ '!s' 、 repr() を呼ぶ '!r' 、 ascii() を呼ぶ '!a'
- 置換後の
deploy.py
の 該当行の中身 ->ALLOWED_HOSTS = ['<ユーザ名>.pythonanywhere.com']
- 補足:
- よって、
ALLOWED_HOSTS = []
のままで良い
DEBUG
をFalse
に変更
config/settings/deploy.py
の差分
-DEBUG = True
+DEBUG = False
- 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': [
最初に探索されるのが、この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
) を配置する
- テンプレートファイル(
- application と同名(=
- application(=
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
) を配置する
- テンプレートファイル(
- application と同名(=
test
├── blog
│ ├── __init__.py
│ (※中略)
├── config
│ ├── __init__.py
│ (※中略)
├── manage.py
├── static
└── templates # テンプレートファイル(`html`) の配置場所
└── blog
├── post_list.html
└── xxxxx.html
- 上記 (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_DIRS
にos.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
(ローカル開発環境用) のみに設定して, デプロイ先環境 では設定しない
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-1. 補足) 参照
python - DjangoにおけるSTATIC_ROOT,STATICFILES_DIRS, STATIC_URLの違いとは - スタック・オーバーフロー
STATIC_ROOT
デプロイ先環境でのみ利用される。nginxで静的ファイルを配信したい場合など。
manage.py collectstatic
によって静的ファイルがここにコピーされる。
- 英語→日本語、協定世界時→日本標準時 に変更
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
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
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()
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.) の設定変更で、
python3 manage.py
コマンド を実行するとdeploy.py
(デプロイ先環境用) の方をデフォルトで読み込むため、
- ローカル開発環境 で実行する際は
--settings
オプション を付けてpycharm.py
(ローカル開発環境用) を指定する- 以下 (21.) 参照
- デフォルトで DB に
sqlite3
が指定されている - DB の場所は
BASE_DIR
(12-1. で設定) 直下にdb.sqlite3
という名前の ファイル が作成される- 上記 5. で追加した .gitignore に
db.sqlite3
が含まれているため、コミット対象外
- 上記 5. で追加した .gitignore に
config/settings/base.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
- デプロイ先環境 ( PythonAnywhere ) でも
sqlite3
を使用するためbase.py
(共通用) に定義
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
ls -l db*
実行
(venv) $ ls -l db*
(実行結果)
% ls -l db*
-rw-r--r-- 1 xxxxxxxx staff 131072 6 14 14:40 db.sqlite3
python3 manage.py dbshell
実行- 上記 19-2. の設定変更で
deploy.py
(デプロイ先環境用) の方をデフォルトで読み込むため、--settings
オプション を付けてpycharm.py
(ローカル開発環境用) を指定する
(venv) $ python3 manage.py dbshell --settings config.settings.pycharm
.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
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.
python3 manage.py runserver
実行- 上記 19-2. の設定変更で
deploy.py
(デプロイ先環境用) の方をデフォルトで読み込むため、--settings
オプション を付けてpycharm.py
(ローカル開発環境用) を指定する
(venv) $ python3 manage.py runserver --settings config.settings.pycharm
- http://127.0.0.1:8000/ にアクセス
- 「インストールは成功しました!おめでとうございます!」という画面 が表示されれば OK
- http://127.0.0.1:8000/admin にアクセス
- ユーザ名=
admin
, パスワード=admin
上記(22.)で作成した superuser の設定でログイン- Django 管理サイト が表示されれば OK
- ユーザ名=
24. Django Girls Tutorial 開始
以下のディレクトリ/ファイル構成が Tutorial とは異なるため、置き換えながら進める
mysite/
→config/
mysite/settings.py
→config/settings/base.py
,config/settings/pycharm.py
,config/settings/deploy.py
- => (16. TEMPLATES パス設定 追加), (17. 静的ファイルの パス設定 追加) 参照
- ローカル開発環境で
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
- デプロイ先環境( PythonAnywhere ) 内では ヘルパー(
pa_autoconfigure_django.py
) を実行 するため、意識する必要が無い - => デプロイ! · Django Girls Tutorial 参照
24-4. 注意事項(4) デプロイ先環境( PythonAnywhere ) で エラーが発生する
- デプロイ! · Django Girls Tutorial で
- デプロイ先環境( PythonAnywhere ) の コンソールから
- ヘルパー(
pa_autoconfigure_django.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
- 今度は別のエラー発生
- 以下のエラー発生
- 原因
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 :-(
- 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
(デプロイ先環境用)
- pythonanywhere で用意している
~/.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 にアクセスすると 管理サイト
- http://<ユーザ名>.pythonanywhere.com/ にアクセスすると