【Django】×PythonAnywhereでのデプロイが上手くいかない時にやってみたこと

##概要
この記事では__[Django-girls](https://tutorial.djangogirls.org/ja/)のチュートリアル__を進める初心者向けに、PythonAnywhere上でのConsoleがうまく挙動しなくなった際の留意点を~~初心者が~~幾つかまとめておく。

半日くらい分かんなくてもう無理詰んだ、って思っても
まぁ、大体エラー文を読み続けてればなんとかなります。たぶん。


##実行環境

 - Windows10 64bit
 - Python 3.6
 - git version 2.27.0.windows.1
 - Chromeブラウザ

##エラーが出た際の確認手順
<b>web上でうまく表示されないとか</b>
![Something-went-wrong.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217271/457ed04b-56d7-a501-62b7-e77c74cd0b08.jpeg)
#####
<b>コンソールが途中で止まるとか</b>
![Console.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217271/8462ad67-d094-537c-ba62-6c1fb9ebedac.jpeg)

原因は色々考えられるが、
####１．まずはリモートリポジトリにあげる前のローカル環境で実行してみよう。
![Domein for Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217271/b6ad0afa-fbbf-579b-4b51-556f92f5feae.png)
`python manage.py runserver`を実行して、サイトが動いているか（変更が反映されているか）確認。

ここでhtmlやcssが反映されていない場合は、
 - __サーバーを再度走らせる__
 - __ブラウザの更新ボタンを右クリックしてキャッシュクリア＆リロード__
を試す。
反映されない場合、__コードのほうに誤りがないか確認__する。

問題がなければ次のステップ。

---
####２．GitHubにちゃんと変更がpushされているか確認。

ブラウザからリポジトリの中にある、更新したファイルをみてみる。
反映されていない場合、Console上で再度以下のコマンドをたたく。

```bash
% git status
% git add --all .
% git status
```
赤文字が緑になったら選択されているので、そのままコミット。(XXXXはブランチ名)

```bash
% git commit
% git push origin XXXX
```

__詳しい用語の説明__については、他記事で分かりやすくまとめてくれている方がいるのでここでは省略する👉[（【Git】オレならこう説明する！Git初心者への用語説明）](https://qiita.com/nnahito/items/e546b27f73e7be131d4e)

#####※git statusで変更が検出されない場合は以下の手順を試す

```bash
% git fetch --all
% git add -A
% git commit -m"recommit" -v
% git push
```

#####※マージせなあかんで！と怒られちゃった場合
```bash
% git merge --allow-unrelated-histories origin/master
```
調べたところ、どうも現verでは__関係のないヒストリー同士をマージするにはオプションの追記が必要__らしい。詳しくはこちらの記事👉（：[初めてGitHubリポジトリにpushしたらrejectedエラーになったときの対応メモ](https://qiita.com/takanatsu/items/fc89de9bd11148da1438)）

#####※(余談)プルしようとしたら「マージする前にコミットするか隠して！」と怒られた場合👇
```bash:ErrorMessage
error: Your local changes to the following files would be overwritten by merge: 
         XXXX.py
Please commit your changes or stash them before you merge.
Aborting
```
######対処法➊：隠す
```bash
#一旦退避してプル
$ git stash
$ git pull origin master
#スタッシュを戻す
$ git stash pop
``````

######対処法➋：強制的にマージ（とにかくリモートに合わせれりゃいい！って時にオススメ）
```bash
$ git fetch origin
$ git reset --hard origin/master
``````

リモートリポジトリに無事プッシュ出来たら、PythonAnywhere.comへ。

---
####３．PythonAnyWhere上でConsoleエラーが出る時

GitHubまではうまくいってるのに、ブラウザにうまく表示されない。
そん時は、だいたいConsoleを立ち上げればヒントが隠されている。

Consoleを立ち上げて
通常、`--nuke`オプションを付与して以下のコマンドを実行することで自動でvenvを作り直したりあれこれ自動でやってくれる。

```bash
pa_autoconfigure_django.py https://github.com/your-github-username/my-first-blog.git --nuke
```

これでうまく表示されればそれでOK。

自分の場合、復習がてらもう一度 同一コンソール上からPythonAnywhere.comを作る所からやろうとして、__見事に躓いた。__

⇩`KeyError: 'collectstatic'`と表示されとまってしまう。
![Console2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217271/f4d7bc60-f4b6-714e-d257-2f3281981c93.jpeg)

色々と試行錯誤した結果、
__原因はSECRET_KEYが上手く読み込まれてないこと__と分かった。
どうりで、ページは表示されなくなるし作り直そうとしても途中で止まってしまうわけだ・・。~~.ignoreに指定しているからよく考えなくても当たり前だったorz~~

__[この記事](https://qiita.com/haessal/items/abaef7ee4fdbd3b218f5)__を参考に別スクリプトでランダム生成してから読み込む形にしていたので、

```python
from django.core.management.utils import get_random_secret_key

secret_key = get_random_secret_key()
text = 'SECRET_KEY = \'{0}\''.format(secret_key)

with open('local_settings.py', 'w') as f:
  print(text, file=f)

```
に少し変えてPythonAnywhereの__ブラウザ上から一回Run__。

無事SECRET_KEYが生成され、再びBashコンソールから上述の`--nuke`付コマンドで再構築。
そのまま再度pullして、

```bash
$ cd ~/<your-pythonanywhere-domain>.pythonanywhere.com
$ git pull
```
無事反映。
サイトが表示された。![pyhonanywhere django.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217271/344c7e41-6683-b261-05fc-6ccf5881036d.jpeg)


##思ったこと

Django-girlsのチュートリアル、SECRET_KEYを分離させないのはなんでなんだろう。。
でもまあ、躓いたおかげででGitHuへコミットする流れやらバージョン管理の仕組みやら体感出来て理解ふかマンハッタン島。
__この記事が役に立ったらLGMTしてくれると励みになります。__

---
#####(Reference&&Thanks)
 - [Djangoの使い方～デプロイ編②～](https://qiita.com/connecrew-sugiyama/items/5080052e564334672bd6#pythonanywhere-%E3%81%A7%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)
 - [DjangoのSECRET_KEYをバージョン管理対象外にする](https://qiita.com/haessal/items/abaef7ee4fdbd3b218f5)
 - [KeyError: 'collectstatic' When deploying the Django application to pythonanywhere]
(https://stackoverflow.com/questions/55629795/keyerror-collectstatic-when-deploying-the-django-application-to-pythonanywher)  
 - [gitでリモートのブランチにローカルを強制一致させたい時](https://qiita.com/ms2sato/items/72b48c1b1923beb1e186)
 - [本番環境でpullしたらコンフリクト？解決法３パターン！](https://qiita.com/15grmr/items/433ee3b47828aaad32a8)