もた日記

くだらないことを真面目にやる

Djangoメモ(2) : Python, Pipenv, Djangoのインストールと動作確認

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にDjangoの環境を構築してみる。

チュートリアルでの環境構築

チュートリアルではPython 3.6.2, Django 1.11.4と仮想環境を構築するVirtualenvをインストールしている。
macOSの場合に実行しているコマンドを整理すると以下の通り。その他、チュートリアルではWindows, Linuxでのインストール方法も説明してあるので参考になる。

$ brew install python3
$ python3 --version
Python 3.6.2
$ sudo pip3 install virtualenv
$ mkdir myproject
$ cd myproject
$ virtualenv venv -p python3
$ source venv/bin/activate
$ pip install django==1.11.4


Pipenvを使った環境構築

上記の方法でもよいが、今回はpipとVirtualenvを連携して管理できるPipenvで環境を構築してみる。

pyenvのインストール

PipenvではPythonのバージョン管理ができるpyenvと連携できるようなのでまずはpyenvをインストールする。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

試しにanaconda3-5.0.1をインストールしてglobalに設定しておく。

$ pyenv install anaconda3-5.0.1
$ pyenv global anaconda3-5.0.1
$ python --version
Python 3.6.3 :: Anaconda, Inc.
$ pyenv versions
  system
* anaconda3-5.0.1 (set by /home/vagrant/.pyenv/version)


Pipenvのインストール

Pipenvをpipコマンドでインストールする。

$ pip install pipenv

インストールされていることを確認。

$ pipenv --version
pipenv, version 10.1.0
$ pipenv --help
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Options:
  --update         Update Pipenv & pip to latest.
  --where          Output project home information.
  --venv           Output virtualenv information.
  --py             Output Python interpreter information.
  --envs           Output Environment Variable options.
  --rm             Remove the virtualenv.
  --bare           Minimal output.
  --completion     Output completion (to be eval'd).
  --man            Display manpage.
  --three / --two  Use Python 3/2 when creating virtualenv.
  --python TEXT    Specify which version of Python virtualenv should use.
  --site-packages  Enable site-packages for the virtualenv.
  --version        Show the version and exit.
  -h, --help       Show this message and exit.

Commands:
  check      Checks for security vulnerabilities and against PEP 508 markers
             provided in Pipfile.
  clean      Uninstalls all packages not specified in Pipfile.lock.
  graph      Displays currently–installed dependency graph information.
  install    Installs provided packages and adds them to Pipfile, or (if none
             is given), installs all packages.
  lock       Generates Pipfile.lock.
  open       View a given module in your editor.
  run        Spawns a command installed into the virtualenv.
  shell      Spawns a shell within the virtualenv.
  sync       Installs all packages specified in Pipfile.lock.
  uninstall  Un-installs a provided package and removes it from Pipfile.

なお、Pipenvのコマンドを補完したい場合は下記コードを.bashrc, .zshrcなどに追加。

eval "$(pipenv --completion)"

f:id:wonder-wall:20180301233955p:plain


仮想環境構築

pyenvとPipenvのインストールが完了したのでmyprojectディレクトリに仮想環境を構築する。
今回はPython 3.6.4を使用したいのでpipenv --python 3.6.4のようにしてバージョンを指定する。
途中、pyenvでPython 3.6.4をインストールするか聞かれるのでYを入力。

$ mkdir myproject
$ cd myproject
$ pipenv --python 3.6.4
Warning: Python 3.6.4 was not found on your system…
Would you like us to install CPython 3.6.4 with pyenv? [Y/n]: Y
Installing CPython 3.6.4 with pyenv (this may take a few minutes)…
⠼Downloading Python-3.6.4.tar.xz...
-> https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
Installing Python-3.6.4...
Installed Python-3.6.4 to /home/vagrant/.pyenv/versions/3.6.4


Creating a virtualenv for this project…
Using /home/vagrant/.pyenv/versions/3.6.4/bin/python3.6m to create virtualenv…
⠴Running virtualenv with interpreter /home/vagrant/.pyenv/versions/3.6.4/bin/python3.6m
Using base prefix '/home/vagrant/.pyenv/versions/3.6.4'
New python executable in /home/vagrant/.local/share/virtualenvs/myproject-j-SR1M6H/bin/python3.6m
Also creating executable in /home/vagrant/.local/share/virtualenvs/myproject-j-SR1M6H/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /home/vagrant/.local/share/virtualenvs/myproject-j-SR1M6H
Creating a Pipfile for this project…

上記のようなメッセージが表示され、Python 3.6.4のインストールと仮想環境の構築が完了する。また、カレントディレクトリにPipfileというファイルが作成される。
仮想環境を有効にするにはpipenv shellを実行。プロンプトに(myproject-j-SR1M6H)のような仮想環境の情報が表示されるようになる。

$ pipenv shell
Spawning environment shell (/usr/local/bin/zsh). Use 'exit' to leave.
. /home/vagrant/.local/share/virtualenvs/myproject-j-SR1M6H/bin/activate
$ . /home/vagrant/.local/share/virtualenvs/myproject-j-SR1M6H/bin/activate
(myproject-j-SR1M6H) $ python --version
Python 3.6.4

仮想環境のPythonはpipenv shellを実行しない状態でpipenv run pythonとしても実行できる。

$ pipenv run python --version
Python 3.6.4

構築された仮想環境のパスは--venvオプションで確認可能。

$ pipenv --venv
/home/vagrant/.local/share/virtualenvs/myproject-j-SR1M6H


パッケージのインストール

仮想環境にパッケージをインストールする前にpip listPipfileの中身を確認してみる。

$ pipenv run pip list
Package           Version
----------------- -------
pip               9.0.1
setuptools        38.5.1
wheel             0.30.0
$ cat Pipfile
[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[packages]



[dev-packages]



[requires]

python_version = "3.6"

パッケージはpipenv installコマンドでインストールできるのでDjango 2.0.2をインストールしてみる。

$ pipenv install django==2.0.2
Installing django==2.0.2…
Collecting django==2.0.2
  Using cached Django-2.0.2-py3-none-any.whl
Collecting pytz (from django==2.0.2)
  Using cached pytz-2018.3-py2.py3-none-any.whl
Installing collected packages: pytz, django
Successfully installed django-2.0.2 pytz-2018.3

Adding django==2.0.2 to Pipfile's [packages]…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (9b28aa)!
Installing dependencies from Pipfile.lock (9b28aa)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 2/2 — 00:00:01
To activate this project's virtualenv, run the following:
 $ pipenv shell

Djangoがインストールされ、Pipfileの[packages]にも追記されていることが確認できる。
また、Pipfile.lockというJSON形式のファイルも作成される。
別PCなどの作業環境で、同じ仮想環境を作成したい場合はこれらPipfilePipfile.lockをもとに作成できるようだ。

$ pipenv run pip list
Package    Version
---------- -------
Django     2.0.2
pip        9.0.1
pytz       2018.3
setuptools 38.5.1
wheel      0.30.0
cat Pipfile
[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[packages]

django = "==2.0.2"


[dev-packages]



[requires]

python_version = "3.6"

なお、--devを指定すると開発環境だけで使用したいパッケージをインストールできる。

$ pipenv install --dev ipython==6.2.1
$ cat Pipfile
 ...
[dev-packages]

ipython = "==6.2.1"
 ...


Djangoの動作確認

インストールしたDjangoの動作確認をするために新規プロジェクトを作成する。 mkdir myprojectで作成したディレクトリに移動して下記コマンドを実行。

(myproject-j-SR1M6H) $ django-admin startproject myproject

以下のディレクトリツリーのようにファイルが作成される。

myproject             # mkdirで作成したディレクトリ
├── myproject         # プロジェクトのただの入れ物。名前の変更が可能
│  ├── manage.py      # コマンドラインユーティリティ
│  └── myproject      # プロジェクトの実際のPythonパッケージ
│     ├── __init__.py # Pythonパッケージであることを知らせる空ファイル
│     ├── settings.py # 設定ファイル
│     ├── urls.py     # URL宣言
│     └── wsgi.py     # WSGI互換Webサーバーとのエントリーポイント
├── Pipfile
└── Pipfile.lock

manage.pyがあるディレクトリに移動してrunserverコマンドで開発用サーバを起動。
You have 14 unapplied migration(s).というメッセージが表示されるが今は気にしない。

$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

March 04, 2018 - 16:56:45
Django version 2.0.2, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

http://127.0.0.1:8000/にアクセスすると動作確認のページが表示されるが、Vagrantを使用している場合などは以下のように指定する(0:30000.0.0.0:3000の省略形で全ての IP からのリクエストを受け付ける )。

$ python manage.py runserver 0:3000

下記画面が表示された場合は画面の指示通りにsettings.pyALLOWED_HOSTSにIPアドレスを追加する。

f:id:wonder-wall:20180225160140p:plain

ALLOWED_HOSTS = ['192.168.33.10']

最終的に下記画面が表示されれば動作確認は完了。

f:id:wonder-wall:20180225160847p:plain


まとめ

  • PipenvによるPython, Djangoの環境構築を実施
  • pipenv installで仮想環境にパッケージをインストール
  • pipenv shellで仮想環境が有効化されたシェルを起動
  • pipenv runで仮想環境でコマンドを実行
  • django-admin startprojectでプロジェクトの雛形を作成
  • python manage.py runserver 0:3000で開発用サーバを起動
  • DisallowedHost at /エラーはALLOWED_HOSTSにIPアドレスを追加