【Django】DjangoによるWeb開発プロジェクトPart1 - 環境構築編 -

## はじめに

こんにちは。今回本格的に開発したいプロジェクトが出来たため、PythonによるWeb開発を行なっていきたいと思います。
なぜPythonで開発するのかと言いますと、あるライブラリとツールがPythonで開発されているためです。
今回は、PythonのWebフレームワークの一つとして有名なDjangoを用いてWeb開発を進めていきたいと思います。
なお、今回の開発環境はFreeBSDで行なっています。
筆者はPythonに関しても、Goと同じく(詳しくはこちら→ [https://qiita.com/himrock922/items/1d70686aabaac49b54fd](https://qiita.com/himrock922/items/1d70686aabaac49b54fd))開発した経験がないため、エビデンス集めから始めていきたいと思います。

## Pythonによる環境構築について

まずはエビデンス集めです。筆者はRubylistなため、rbenvのようなものがPythonにもあるのか調べていたら、[https://github.com/pyenv/pyenv](https://github.com/pyenv/pyenv)がありました。
しかし、pyenvの件については以下のような指摘記事がありました。→ https://ymotongpoo.hatenablog.com/entry/2017/01/29/002039
少し引用させていただきます。

```
プロジェクトで稼働させているバージョンを固定させているならそのバージョンだけ入れればよいわけですし、マイナーバージョンごとにアップデートを行うにしても1年に1度あるかないか、さらに攻めた環境でマイクロバージョンごとにインストールするにしてもたかが知れています。
（マイナーバージョンは大概がセキュリティフィックスか明らかなバグ修正。）であれば、pyenvでPythonを新規にインストールする必要ってどれくらいあるんでしょう。
```

元々、Pythonのインストールは `configure`, `make`, `make install` で事足りるので(そもそもpyenvもそれをバックエンドでやっている)、わざわざpyenvを使う必要がないとの事です。

また、Python3以降からプロジェクト毎に固有の環境が作成することができるvenvがサポートされている模様です。
venvはシステムとは独立した仮想環境を作成し、また仮想環境には独立したPythonバイナリがありシステムとは独立したPythonパッケージ群をインストールすることができます。

これを考慮して、Python本体はパッケージインストールを行い、開発毎にvenvで環境を分けていこうと思います。勿論、これはproductionデプロイする時に安定した環境で運用できるように設定したいため、後々変えるかもしれません。

## FreeBSDへの環境構築

では、Pythonのインストールと仮想環境を構築していきたいと思います。

### Pythonのインストール

```bash
% sudo pkg install python37
% mkdir Develpment
% cd Development
% which python3.7
/usr/local/bin/python3.7
```

### 仮想環境の構築

続いて仮想環境を構築していきます。

```bash
% python3.7 -m venv application_environment
```

仮想環境が作成されれば、そのディレクトリ配下にあるスクリプトで仮想環境の有効化が行えます。

```bash:zshの場合
% cd application
% source ./bin/activate
```

## 仮想環境上に必要なライブラリをインストール

仮想環境を有効にしたら、Djangoをインストールします。

```bash
% pip install django
```

Djangoをインストール後、新しいスケルトンサイトを作成するために、`django-admin`を実行し、Djangoによるアプリケーションをディレクトリ配下にインストールします。念の為、仮想環境とは別のディレクトリでDjangoアプリケーションをインストールすることにしました。今回、プライベートリポジトリで運用していくつもりをしているのでアプリケーション名は伏せさせていただきます。

```bash
% cd ..
% mkdir django
% cd django
```

試しにDjangoを起動してみました。

```bash
% python3.7 manage.py runserver
% django-admin startproject application
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/usr/home/himrock922/Development/jail_hosting_system/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 10, in <module>
    from sqlite3 import dbapi2 as Database
  File "/usr/local/lib/python3.7/sqlite3/__init__.py", line 23, in <module>
    from sqlite3.dbapi2 import *
  File "/usr/local/lib/python3.7/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ModuleNotFoundError: No module named '_sqlite3
```

sqlite3が必要な模様なため、あらかじめパッケージインストールしておきます。

```bash
% sudo pkg install sqlite3
```

また、今回VPSを借りて運用しているため、Djangoが起動しているか確認するために、あらかじめsettings.pyにてアクセス許可するIPアドレスにVPSに紐づいている固定IPアドレスを追加しておきます。

```python:settings.py
ALLOWED_HOSTS = ['*.*.*.*']  
```

Djangoを動かすためには、runserverを引数として実行します。ただし、デフォルトでは127.0.0.1で待ち受けするため、これをVPSのアドレスで待ち受けできるようにもう一つ引数を指定してあげます。

```bash
% python3.7 manage.py runserver *.*.*.*:8080
```

以上で、デフォルトのWellComeページ(?)が閲覧できるようになりました。

![FireShot Capture 13 - Django_ the Web framework for perfectionists w_ - http___133.242.137.151_8080_.png](https://qiita-image-store.s3.amazonaws.com/0/144991/06a64465-618c-b809-4fc3-2bbe5df8dd28.png)

一旦ここまでのパッケージ群のバージョンを固定し、一括管理できるように`pip freeze`を利用してリポジトリに登録しておきます。

```bash
% pip freeze > packages.txt
% git add .
% git commit -m "first commit"
% git push origin master
```

## まとめ

Djangoについての環境構築でした。今回はあまり大したことしていませんが、今後Djangoによる開発を進めるにあたり、どんどん書いていきたいと思います。

## シリーズ

[Part 1](https://qiita.com/himrock922/items/1daf1c5c6eedfcb7f661) → [Part 2](https://qiita.com/himrock922/items/bd020a0d313233556c97)

## 参考文献

* [Pythonの仮想環境構築 2017.01版](https://ymotongpoo.hatenablog.com/entry/2017/01/29/002039)
* [Pythonの仮想環境構築(2017年版) pyenvとpyenv-virtualenvとvirtualenvとvirtualenvwrapperとpyvenvとvenv](https://qiita.com/maskedw/items/aaa2fd7abfd493cf2820)
* [28.3. venv — 仮想環境の作成](https://docs.python.jp/3/library/venv.html)
* * [Django 開発環境の設定](https://developer.mozilla.org/ja/docs/Learn/Server-side/Django/development_environment)