Djangoを使うための環境構築を、初心者が躓きながら頑張る話

#Djangoってなんぞや
追記します。

##この記事を書く理由
初心者って、すっごいしょっぱいところですごい時間を溶かしてしまうのだけど、
そんな初心者な私が立ち止まった内容が一個に詰まっているような記事が一本あってもいいなと思ったから。
#画面立ててみよう
特に共同開発でもないことから、最新のバージョンでやってみようと思いました。
python 3.7
anaconda3.0
Django 2.0

anacondaは便利だから～と先輩に言われて入れただけで、特に考えなしに統合版を入れていた。
#仮想環境を作るための準備
簡単。コマンドを実行するだけです。
pipを入れていない場合は入れてあげてください。
##virtualenvのinstall
簡単、以下コマンドを実行するだけ。

```console:console
$pip install virtualenv
・・・
Successfully installed virtualenv-16.6.0
```
ちなみにproxyでこけるとこんな感じになります。

```console:console
C:\Users\workspace>pip install virtualenv
Collecting virtualenv
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(10054, '既存の接続はリモート ホストに強制的に切断されました。', None, 10054, None))': /simple/virtualenv/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(10054, '既存の接続はリモート ホストに強制的に切断されました。', None, 10054, None))': /simple/virtualenv/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(10054, '既存の接続はリモート ホストに強制的に切断されました。', None, 10054, None))': /simple/virtualenv/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(10054, '既存の接続はリモート ホストに強制的に切断されました。', None, 10054, None))': /simple/virtualenv/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(10054, '既存の接続はリモート ホストに強制的に切断されました。', None, 10054, None))': /simple/virtualenv/
  Could not find a version that satisfies the requirement virtualenv (from versions: )
No matching distribution found for virtualenv
```
プロキシ環境下では以下のように引数にプロキシを与えてあげることで実行が可能です。

```console:console(proxy環境下)
$pip install virtualenv --proxy http://****:8080/
```
Successfullyと表示されたら完了です。
##仮想環境を任意ディレクトリに作成
これが本編。仮想環境を作るなら、任意のディレクトリ以下で以下コマンドを実行してあげればよい。

```console:console
$virtualenv env1
```
これが私は上手くいきませんでした。

```console:console
C:\workspace\study>virtualenv env1
Using base prefix 'c:\\users\\workspace\\appdata\\local\\continuum\\anaconda3'
  No LICENSE.txt / LICENSE found in source
New python executable in C:\workspace\study\env1\Scripts\python.exe
Installing setuptools, pip, wheel...
done.
Traceback (most recent call last):
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\site-packages\virtualenv.py", line 900, in call_subprocess
    line = line.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8a in position 184: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\workspace\AppData\Local\Continuum\anaconda3\Scripts\virtualenv.exe\__main__.py", line 9, in <module>
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\site-packages\virtualenv.py", line 831, in main
    symlink=options.symlink,
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\site-packages\virtualenv.py", line 1123, in create_environment
    install_wheel(to_install, py_executable, search_dirs, download=download)
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\site-packages\virtualenv.py", line 973, in install_wheel
    _install_wheel_with_search_dir(download, project_names, py_executable, search_dirs)
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\site-packages\virtualenv.py", line 1060, in _install_wheel_with_search_dir
    call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=script)
  File "c:\users\workspace\appdata\local\continuum\anaconda3\lib\site-packages\virtualenv.py", line 902, in call_subprocess
    line = line.decode(fs_encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8a in position 184: invalid start byte
```
このタイミングで文字コードに関するエラー。
初心者向けのセットアップ記事にはこのエラー対応が書いていない。
さらに、エラー文を検索しても有用な記事がうまく見つからず、多大な時間を沼に捨てた。

##原因
https://paihu.hatenablog.com/entry/2018/10/27/133958
この方のブログにある通り。

エラーで落ちているところは以下メソッドで、ここでUTF-8を返してしまっているのが悪い。
>sys.getdefaultencoding()
>Unicode 実装で使用される現在のデフォルトエンコーディング名を返します。
https://docs.python.org/ja/3/library/sys.html#sys.getdefaultencoding

そこで、mbcsを返したいのであれば、以下
>バージョン 3.6 で変更: Windows はもう 'mbcs' を返す保証は無くなりました。 より詳しいことは PEP 529 および _enablelegacywindowsfsencoding() を参照してください。
https://docs.python.org/ja/3/library/sys.html#sys.getfilesystemencoding

一通り読んで見たが、anaconda3.0の統合版から呼び出されるvirtualenv.pyのエンコーディングの部分が、Python3.6より前であるmbcsを求めているところ、pythonは3.6からデフォルトutf-8になっててエンコーディング無理だよ、ということ、らしい。たぶん。
##結論
先ほどの参考にさせて頂いた記事の通りにデフォルトエンコーディングの変更をします
pythonが起動する時に、一度だけ実行されるsitecustomize.py。
Pythonが置いてあるフォルダ階層まで行き、
``\Lib\site-packages\``
以下ディレクトリに新しくpythonファイルを作成し、以下の記載を行います。

```python:sitecustomize.py
import sys
sys._enablelegacywindowsfsencoding()
```
これだけでOK
再度virtualenvのコマンドを実行してみてください。エラーが消えているはず。

##起動確認
一応起動確認しましょう。

```console:console
$cd Scripts
$activate
(env1)$ //ディレクトリの左側に仮想マシンの名前がつくようになります。
```
これで起動確認は終了です。
#仮想環境の中身を作る
もちろん、作ったばかりの仮想環境には何も入っていません。
Djangoが入っているか確認してみます。

```console:console
$python -m django --version
C:\Users\workspace\AppData\Local\Continuum\anaconda3\python.exe: No module named django
```
入ってないです。あたりまえだけど。
ないなら入れましょう。

```console:console(proxy環境下)
$pip3 install django --proxy http://****:8080/
```
再度、バージョン確認のためのコマンドを実行すると、バージョンが表示されるかと思います。

```console:console
$python -m django --version
2.2.1
```
#Djangoアプリケーションの作成
ここまで来たら、あとはもうDjangoのプロジェクトを作るだけです。

```console:console
$django-admin startproject mySite
```
↑でプロジェクトを作成したら、プロジェクトのディレクトリに一階層潜ってから、

```console:console(mySite\)
$python manage.py startapp myapp
```
↑でWEBテンプレートを作成します。

この辺は後で触るとして、一旦起動してみましょう。
先ほど作成したDjangoのアプリケーション直下で以下コマンドを実行します。

```console:console(mySite\)
$python manage.py runserver
```

後はローカルホストにアクセス。
``http://localhost:8000/``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353603/b3fd43f2-7ef4-762b-8559-0e7f79feff49.png)
えらいポップな画面が表示されたら作成完了です。おめでとうございます。

##ちなみに
``http://localhost:8000/admin``
に飛ぶことで、管理者ログイン画面に現時点でも飛ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353603/b3b01ad0-4989-9bc5-5ca4-060a514ec459.png)

以下のようにユーザーを作ることでログインが可能です。

```console:console
$python manage.py migrate
$python manage.py createsuperuser
Username (leave blank to use '***'): admin
Email address: admin@admin.jp
Password:
Password (again):
This password is too common.
Bypass password validation and create user anyway? [y/N]: 
Superuser created successfully.
```

ユーザー名はお好みでよいですが、Emailはちゃんとバリデーションが掛かっているので適当だと怒られます。

再度起動し、さっき作ったユーザーでログインすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353603/01ec8d44-7a2a-4c0f-e376-11cfa0be6ccd.png)
ログインできました。