venvでDjangoの環境を作成してみたった(Python3.3以降)

## venvとは？

[venv: Python 仮想環境管理](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e
)によれば、

> venv は virtualenv が Python 3.3 から標準機能として取り込まれたもの

らしい。

## 前提

以下のエントリーにてPython3系のインストールまでやってください。

[Vagrant + Ubuntu + VirtualBoxでPythonの環境構築したった](https://qiita.com/taaaaak/items/9cdc9ddd5b09975dc7ea)

## venvでPython環境を構築する

### Django Girls Tutorial

現在Rails Tutorialのように日本語でDjangoを学べるネット教材で人気がありそうなのは以下

[Django Girls Tutorial](https://tutorial.djangogirls.org/ja/installation/)

まずは上記にしたがってコマンドを実行していく。

#### 専用の環境を作成する

```python
python3 -m venv myvenv
```

#### アクティベートする

```shell
source myvenv/bin/activate
```

> venv が起動すると、プロンプトの行頭に(myvenv)が現れます。

※必要ならpipをインストール
（私の環境ではすでにインストールされていた模様、、、たぶんvenvのpipじゃないと思うんだけど、この辺よくわかってない）

```shell
python3 -m pip install --upgrade pip # 私の環境ではすでにあるぜ！って言われてアンスコしてた、、、
```

#### 設定ファイルを作成する

設定ファイル作成

```shell
touch requirements.txt
```

インストールしたいDjangoのバージョンを指定する

```shell
echo Django~=2.0.6 >> requirements.txt
```

確認する

```shell
cat requirements.txt
```

#### Djangoをインストールする

```shell
pip install -r requirements.txt
```

#### プロジェクトディレクトリを作成する

**以下、[コメント](https://qiita.com/taaaaak/items/bc06c45158b42b6450ba#comment-7792c42108a01bbbdc45)をいただいたものを追記しました。**

※最新の環境での動確はしていないため、動作保証できません。ご了承ください。

```
$ django-admin startproject mysite
を実行して
manage.pyがあるディレクトリでマイグレーションを実行する必要があります。
```

#### マイグレーション

```shell
python manage.py migrate
```

#### サーバ起動

```shell
python manage.py runserver 0.0.0.0:8080
```

##### トラブルシューティング

`Invalid HTTP_HOST header: '192.168.33.10:8080'. You may need to add '192.168.33.10' to ALLOWED_HOSTS.`

`mysite/settings.py`　にて以下を記載する。

```shell
ALLOWED_HOSTS = ['192.168.33.10']
```

#### 完成

`http://192.168.33.10:8080/`にアクセスする。

※vagrantの `public_network` とかのIPを見てください。

```Vagrantfile
  config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", guest: 8000, host: 9080, host_ip: "127.0.0.1"
  config.vm.network "private_network", ip: "192.168.33.10"
```

<img width="1074" alt="スクリーンショット 2019-02-03 17.37.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/87431/755d6d84-4287-accc-46df-19cb8ce92a4e.png">

こんな感じになれば成功！！

#### サーバを停止する

以下の画面にて `ctrl + C` するとコマンド受付状態に戻る。
ちなみにサーバ起動状態は `(サーバ)コンソール` とかって言う。

```
(myvenv) vagrant@ubuntu-xenial:~/tmp/djangogirls$ python manage.py runserver 0.0.0.0:8080
Performing system checks...

System check identified no issues (0 silenced).
February 03, 2019 - 17:36:41
Django version 2.0.10, using settings 'mysite.settings'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.
[03/Feb/2019 17:37:21] "GET / HTTP/1.1" 200 16510
```

#### virtualenvをディアクティーベート（無効化）する

サーバ停止できたらvenvも止めておく。
環境が消えるわけではない！（電源を消しておくイメージ！）

```shell
deactivate
```

## Python基礎
  
こちらは環境構築とは関係ありません。  
  
私の個人的な備忘録となります。  
  
ご了承くださいませ。  
  
### Python2と3の違い  
  
```python
print 123  # Python2
print(123) # Python3
```
Python3で2の記法で記述すると `SyntaxError: invalid syntax` になった。
  
### dictionary

ディクショナリーというオブジェクトの型の名前。
辞書型と呼ぶ。
このオブジェクトはキーと値のペアの集合で表される。
Rubyで言うところのHash。

#### setdefaultメソッド

要素の追加

```python
mydict = {"ai":1, "apple":2, "attribute":3}
mydict.setdefault("authenticate", 4)
print(mydict) # => {"ai":1, "apple":2, "attribute":3, "authenticate": 4}
```

#### popメソッド

要素の削除

```python
# （続き）
mydict.pop("apple")
print(mydict) # => {"ai":1, "attribute":3, "authenticate": 4}
```

#### clearメソッド

要素の一括削除

```python
# (続き)
mydict.clear()
print(mydict) # => {}
```

### 条件分岐

"else if〜"みたいな書き方は `elif` と書く。
Rubyなら `elsif` だし言語ごとに色がある。

```python
if name == 'Ola':
  print('Hi Ola!')
elif name == 'Sonja':
  print('Hi Sonja!')
else:
  print('Hi anonymous!')
```

### 繰り返し（ループ）

```python
for i in range(1, 6):
    print(i)
```

> https://tutorial.djangogirls.org/ja/python_introduction/

### Pythonでフィボナッチ数  

言葉通りに実装すると再帰的になって、数が大きくなればなるほどつらい。
  
```python
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

print fibonacci(10)
```

https://qiita.com/cohey0727/items/117b55cf73c7784359c0