概要
以下のような流れでエラー発生・解決した記録。データベース接続なしでとにかくDjangoのサーバー起動とアクセスを確認。
- Vagrant上のCentOS7にPython3やvertualenvをインストール
- 仮想環境上でDjango開発用サーバーを起動
- Exception発生
- ひとまずデータベースを切ってサーバー起動
- ブラウザーから接続できず
- Vagrantfileを編集してIPアドレス変更
- DisallowedHostで接続できず
- settings.pyのALLOWED_HOSTを編集
- 無事接続
データベースを繋がずにとにかくDjangoの応答までを確認する場合、Vagrant環境では以下のように設定。
- Vagrantfileでポートマッピングを設定
- VMでifconfig→eth0のIPアドレスを確認
- settings.pyのALLOWED_HOSTSにブラウザーでアクセスしたいホスト名、IPアドレスを追加
- 開発用Webサーバーをeth0のIPアドレスとマップしたポートで起動
- ALLOWED_HOSTSで許可したホスト/IPアドレスとマップしたポートでアクセス
サーバー起動時エラー発生
Vagrant/CentOS7環境上にPython3、virtualenvをインストールして、仮想環境を作成。その環境下でDjangoをインストール。
とりあえずテスト用のプロジェクトを作成。
1 2 3 4 5 6 |
$ django-admin startproject djangotest $ cd djangotest $ ls djangotest manage.py $ ls djangotest/djangotest/ __init__.py asgi.py settings.py urls.py wsgi.py |
プロジェクトで開発用Webサーバーを起動しようとしたところ、エラー発生。SQLiteのバージョンが低いと言っているらしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ python manage.py runserver Watching for file changes with StatReloader Exception in thread django-main-thread: Traceback (most recent call last): File "/usr/lib64/python3.6/threading.py", line 916, in _bootstrap_inner self.run() ........ File "/home/vagrant/.virtualenvs/djangotest/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 73, in <module> check_sqlite_version() File "/home/vagrant/.virtualenvs/djangotest/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 69, in check_sqlite_version 'SQLite 3.9.0 or later is required (found %s).' % Database.sqlite_version django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17). |
SQLiteを確認したところ、3.7と必要なバージョンより確かに低い。
1 2 |
$ sqlite3 --version 3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668 |
データベース無効化で再挑戦
そもそもデータベースにはSQLiteではなくMySQLを使っている。またとりあえずの動作確認なので、データベースを設定せずにサーバーを起動してみようと考える。
Laravelでいえば.env
ファイルにあたる設定ファイルは、Djangoではsettings.py
らしい。その場所を探してみるとプロジェクトディレクトリーと同名のサブディレクトリーにあった。
1 2 |
$ sudo find / -name settings.py /home/vagrant/test/djangotest/djangotest/settings.py |
settings.py
の中のデータベース関係を探して、そこをすべてコメントアウトしてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
""" Django settings for djangotest project. ........ # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases #DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', # } #} ........ # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' |
再度サーバーを起動すると、エラー無く実行された。
1 2 3 4 5 6 7 8 9 |
$ python manage.py runserver Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). March 05, 2022 - 22:38:04 Django version 3.2.12, using settings 'djangotest.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. |
ブラウザーで接続不可
サーバーは起動されたが、ブラウザーでhttp://127.0.0.1:8000
とするとアクセスできない。
1 2 |
このサイトにアクセスできません 127.0.0.1 で接続が拒否されました。 |
Vagrantのプライベートネットワークに沿った設定とサーバー起動が必要なことを忘れていた。
プライベートネットワーク設定
Vagrantfileの内容を確認・編集
1 2 3 4 5 6 7 8 9 10 11 12 |
# Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # NOTE: This will enable public access to the opened port config.vm.network "forwarded_port", guest: 80, host: 8080 config.vm.network "forwarded_port", guest: 8000, host: 8000 config.vm.network "forwarded_port", guest: 3000, host: 3000 ........ # config.vm.network "private_network", ip: "192.168.33.10" # コメントアウトのまま |
vagrant reload
で再起動し、vagrant ssh
でCentOS7に入り、ポート設定を見る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 inet6 fe80::10ae:de8c:87bc:71ab prefixlen 64 scopeid 0x20<link> ether 08:00:27:0e:4e:dd txqueuelen 1000 (Ethernet) RX packets 691 bytes 74221 (72.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 506 bytes 76581 (74.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
ゲスト側のVMからは10.0.20.15
でサーバーを立ち上げ、ホスト側では127.0.0.1
で接続する。ポートフォワーディングはホスト・ゲストとも8000
開発用Webサーバーを10.0.20.15:8000
で起動。
1 2 3 4 5 6 7 8 9 |
$ python manage.py runserver 10.0.2.15:8000 Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). March 06, 2022 - 03:52:36 Django version 3.2.12, using settings 'djangotest.settings' Starting development server at http://10.0.2.15:8000/ Quit the server with CONTROL-C. |
Djangoで許可されない
ブラウザーでhttp://127.0.0.1:8000
やhttp://localhost:8000
とするが接続できない。ただしDjangoによって許可されていないらしく、ALLOWED_HOSTS
を加えるよう示されている。
ALLOW_HOSTSを編集して接続
settings.py
のALLOWED_HOSTS
を編集。
1 2 3 |
ALLOWED_HOSTS = [] ↓ ALLOWED_HOSTS = ['127.0.0.1', 'localhost'] |
ブラウザーからhttp://127.0.0.1:8000
あるいはhttp://localhost:8000
でアクセスでき、以下のページが表示された。