Poetry配下におけるDjangoプロジェクトのconfig（settings.py）に関する学習備忘録

<h3>前提</h3>

以下Qiitaの続きです。現常駐先では今はPythonもJavascriptも書いていないですが、AI導入関連の作業への参画が今後ありうることを念頭に今も [主な参考資料①～④](#主な参考資料) をベースにゆるゆる学習を続けています。 [主な参考資料①](#主な参考資料) にあるのでReactとかも今は使えないですが、老後に備えてそのうちします。たぶん。

https://qiita.com/thinking-weed/items/79569252644403452d8b

**なお、学習はWindowsの私用ノートPC、VScodeで基本的にしています。** また、DjangoプロジェクトのPythonは以下QiitaにあるようにLinuxに入れたものを使っています。**※そのため書き損じがあっても大概wslを基本あらかじめ起動しているものとして読んでください。**

https://qiita.com/thinking-weed/items/dda47b01dff1c294686b
____

とりあえず現在、ポートフォリオのホーム画面だけ概ね移行しました。

<details><summary>フォルダ構成・ブラウザ表示</summary>

![フォルダ構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/65a043de-3346-1ec6-156e-dcd9ebafe7aa.png)

![home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/674ace49-808e-e6e9-72e8-36b51e22d46a.png)
</details>

<h2>〇今回途中生じた問題</h2>
<h3>python-dotenvとか django-extensions とか、poetry add ～で入れて「poetry配下のプロジェクトで使う場合、」settings.pyを少しいじるだけだと上手く働かない外部モジュールがいるらしい</h3>

※venvでは大丈夫でした

<h2>〇結果として有効だった対応</h2>
<h3>poetry add ～とは別にGit for WindowsやプロンプトでWSL使った後、pipでLinuxに入れる</h3>

**※なぜこれでいけるのかは理由は分かっていないし、これが最適解かも分かってないです。**

<details><summary>詳細</summary>

とりあえず、ホーム画面移行したし、Githubにpushでもするか（´д｀）と思ったのですが、**SECRET_KEYとか.envに書いて切り分けるべき存在**忘れてました😇

<h4>※注：Djangoはデフォルトだとプロジェクト作成時点でSECRTE_KEYが以下のsettings.pyに自動生成されるようです。</h4>

というわけで、とりあえず

```powershell
$ poetry add python-dotenv
```
でインストールして、pyproject.tomlに記述。その後.env、.gitignore作った後、以下のように、load_dotenvとかを決まり文句的に書いてwsl⇒python3 manage.py runserverで開発用サーバーを動かして、とりあえず動くか確認すると

![settings.py.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/c710af81-c7a1-c4e6-dd6b-8bd367cb99eb.png)

以下のようにエラーがVScodeのターミナルに出ました・・・

```powershell
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/python3/dist-packages/django/core/management/commands/runserver.py", line 61, in execute
    super().execute(*args, **options)
  File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 398, in execute    
    output = self.handle(*args, **options)
  File "/usr/lib/python3/dist-packages/django/core/management/commands/runserver.py", line 68, in handle
    if not settings.DEBUG and not settings.ALLOWED_HOSTS:
  File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 82, in __getattr__        
    self._setup(name)
  File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 69, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 170, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/mnt/c/xampp/htdocs/Portfolio/Djangoes/django_portfolio/django_portfolio/settings.py", line 16, in <module>
    from dotenv import load_dotenv
ModuleNotFoundError: No module named 'dotenv'

During handling of the above exception, another exception occurred:

～中略～

    from dotenv import load_dotenv
ModuleNotFoundError: No module named 'dotenv'
```
「dotenv」お前さっき入ったんちゃうん？？(-_-)・・

<h2>〇ちょっと迷走した記録</h2>
<details><summary>details</summary>

<h3>試したこと①：pyproject.tomlを確認</h3>

```
[tool.poetry.dependencies]
python = "^3.11"
pytest = "^8.3.3"
Django = "^5.1.3"
requests = "^2.32.3"
pyocr = "^0.8.5"
pillow = "^11.0.0"
django-tables2 = "^2.7.0"
django-filter = "^24.3"
SpeechRecognition = "^3.11.0"
django-extensions = "^3.2.3"
python-dotenv = "^1.0.1"  👈　いるやん(-_-)・・・
```
<h3>試したこと②：Poetry shell（Poetryのインタラクティブシェル）を使って入っているか確認</h3>

※シェル起動時とかに出てくるメッセージは省略しています。
```powershell
$ poetry shell
```
```powershell
$ poetry show python-dotenv
```
結果、以下のように出力されました
```powershell
name         : python-dotenv
version      : 1.0.1
description  : Read key-value pairs from a .env file and set them as environment variables
```
いるやん(-_-)・・・

<h3>試したこと③：全て削除してPythonのバージョンを変えてみて、もう一度1からやる</h3>

エラー(-_-)・・・

</details>

<h2>〇結局何が原因だったか</h2>
<h3>どうもLinux（Ubuntu）の中に、python-dotenvをGit for Windowsとかコマンドプロンプトで別に入れる必要があった</h3>

```
wsl
$ pip install python-dotenv
```
を使ったら下記Linuxフォルダにdotenvが入り全体もなぜか無事動きました。

なお一度アンインストール&再インストールして再現性をもって実証できたのですが、「このpipで入れたdotenv」はどうも **poetry add ～ で入れたものとは別物**でフォルダの場所を示すと以下の場所にインストールされるものにあたるようです。

![dotenv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/3d14b812-cf95-3751-e313-12ca45b751c6.png)

<h3>※poetry add ～で入れたものはどこにあるのか</h3>

**poetry配下のプロジェクトを開いた状態で**

```powershell
wsl
$ poetry env info --path
```
とpoetryコマンドをたたくと「Linux/Ubuntu（等のディストリビューション）」を省略した状態で以下のようなパスが出てきて、
```
/home/Linuxで設定したユーザー名/.cache/pypoetry/virtualenvs/プロジェクト名を含む仮想環境（virtualenv）名
```
実際これをたどるとその奥に以下のようにpoetry add ～ で追加した外部モジュールがどうも入っている「site-packages」というフォルダがあります。

![dotenv_another.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/76bca9fe-0bdc-bb4d-73a1-18d1b4a74b83.png)

____

自分は転職活動中後期からPythonの学習を始めて、だいたい1年強になります。
開発環境どうしてるかの変遷をざっと書くとこんな感じです。

①Python学習当初、仮想環境とかマジで何も考えずにローカルのCドライブにひたすら外部ライブラリー・パッケージをpip install
　　　👇
②Progakuで①はさすがにそれは外部ライブラリー・パッケージ間の干渉を考えたときにヤバいことを教えてもらう😇
　　　👇
③venvとかrequirements.txtを覚えて、しばらく venv でしのぐ
　　　👇
④Poetryさんをさわらせ始めていただく👈今ココ

②と③の間で以前ローカルのCドライブに直に入れた外部ライブラリーをひたすらポチポチpip uninstallした記憶があるのですが、実際pip listで確認すると今は以下みたいになっていました。

<h4>Linuxに今回のように外部ライブラリーを他に別途pipとかで入れた覚えはないので、おそらくpoetryでLinux内に作った仮想環境内の外部ライブラリーが全て拾われて載っているのではないか？？と思っています。</h4>

なお今のところ、 poetryが上手くやってくれているのか外部ライブラリー同士の干渉による不具合が起こった記憶はありません。

![gitforwindows_andsoon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/299a929d-a18c-be7b-cf32-ca99fb3e8785.png)

____

django-extensionsは、ルーティング調べたり、models.pyをもとにER図を作成したりする等Django開発を効率化するための拡張機能を追加する外部ライブラリーです。本題①を対処しようとして、ちょっと迷走している間にpython-dotenv同様とりあえず

```powershell
poetry add django-extensions
```
して入れたつもりになってました。なおこれも本題①同様に Git for Windowsとかで
```
wsl
$ pip install django-extensions 
```
していなかったのが、ボトルネックになっていました。

なお、**django-extensionsは使用する際、プロジェクト作成時にできるデフォルトでできるsettings.py の INSTALLED_APPS の要素に 'django_extensions'を追記する必要があります。**

```プロジェクトと同名フォルダ内にある settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_extensions',  　　　　　　　　 👈こんなかんじ、ここはアンダーバーを使うことに注意
    'resume', #resumeアプリケーションの登録
    'form_components', #form_componentsアプリケーションの登録
]
```

</details>

<h2>〇後日、個人的に発見した関連便利コマンド</h2>

**①poetry配下のプロジェクトにインストールされている外部ライブラリを確認 & それらの依存関係を視覚的に確認**

```powershell
$ poetry show --tree
```
使うとこんな感じで何が入っているのか見えます。
<details><summary>詳細</summary>

![poetry-show-tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/1e5d6511-280c-af1b-59ee-c973a931d444.png)
</details>

**②poetry配下のプロジェクトに関わっている外部ライブラリー・パッケージがどこにいるかを表すパスを一気に洗い出す**

```powershell
wsl
$ python3 -m site
```
使うとこんな感じで外部ライブラリー・パッケージ関連ファイルが入っているパスが一気に出てきます。

<details><summary>詳細</summary>

![python-m-site.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/da202fb0-54ac-85b9-9b36-95128e4dba58.png)

</details>

## 主な参考資料

①Python Django 4 超入門　掌田津耶乃 (著)　秀和システム
<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/Python-Django-4-%E8%B6%85%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798062413/ref=sr_1_2_sspa?crid=MZGZWVELQ6MA&dib=eyJ2IjoiMSJ9.eEG-HVhGiMXwCJ6xOkfrdY5LDwm8oswFB-HEsTcpi7tolQxne-QjUkBh47VWZQ3x4gpZLBuD4C4SqnayOqtCyOBniyYUG3bXWPEWSZmAj1fIy7ZbHDamJ4_lHsR9wXue9mv-YjuM8yXSL0seZrmHPABx8VgWAMcPo71jJeFlQ4DxWIqgTx3W9XULh4FOyhfMkpoRwry1MlAttgFF1WWYY7EjKvJzQn2oP-fSodDEL7TDRVZ0gVNFU2d8wOckHko20_hKYcHBKAlv61MLnPOC6KB9bd6IXk1Zhp75Y2V6lnY.cYHcC9HbRGJ5EP_NWX1lkmumKLak2nM1yfP1DvKPD4A&dib_tag=se&keywords=python+django+4+%E8%B6%85%E5%85%A5%E9%96%80&qid=1735366082&sprefix=Python+Dj%2Caps%2C262&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1
</details>

②Pythonで文書処理: 資料のPDF化、文字認識、検索、その他さまざまな作業をプログラミングで解決　北山洋幸（著）　カットシステム

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/Python%E3%81%A7%E6%96%87%E6%9B%B8%E5%87%A6%E7%90%86%E2%80%95%E8%B3%87%E6%96%99%E3%81%AEPDF%E5%8C%96%E3%80%81%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98%E3%80%81%E6%A4%9C%E7%B4%A2%E3%80%81%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E4%BD%9C-%E5%8C%97%E5%B1%B1-%E6%B4%8B%E5%B9%B8/dp/4877834974
</details>

③Pythonではじめるゲーム制作超入門　知識ゼロからのプログラミングとアルゴリズムと数学　廣瀬　豪（著）　インプレス

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%B2%E3%83%BC%E3%83%A0%E5%88%B6%E4%BD%9C-%E8%B6%85%E5%85%A5%E9%96%80-%E7%9F%A5%E8%AD%98%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%EF%BC%86%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E6%95%B0%E5%AD%A6-%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97-%E5%BB%A3%E7%80%AC-%E8%B1%AA/dp/4295017655
</details>

④これからのJavaScriptの教科書　モダンJavaScriptを基礎から実用レベルまで　狩野 祐東 (著)　 SB Creative
<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AEJavaScript%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E7%8B%A9%E9%87%8E-%E7%A5%90%E6%9D%B1/dp/481561802X/ref=sr_1_1?adgrpid=163129550575&dib=eyJ2IjoiMSJ9.brJJGM6YJp_whwUcq6Viaoy3oxeFJ-J-HIJBq14dwS2l5ZM3KKKFmRb4gs3uy8qOLuLTr0Op1QJzsN1a1OOLcp1rPkWpXjilCorT3XbtH6Q7pNmtV1o146sxufgnwRUk7FJ3TvR4a1dFPDzmyAuJK8xRU07cyM4yRGyHyK5dl-lGvnD1sG7dIJkUIsOtrvfCOM0HDGo9ASBJ2iqUEggqyOgugvPqrDdHm83T3jQwo1YTNgxXgy3J1Dz-w8sFyXhWiwl65Nufm3pxn4cZIzZlQPpLITlw4OaJqsWKHqXW54iIGqHrfbgHa0tBtqwRoQ--JgxgMX5j6NhJhO36R8QccF4Yxw1WhDJZjp8ip-6TNmck9zjkhfj7_92Ws31kuCn_3iNkYpZJnx0NOVdaK8mrmRhlBdN85bXBdMDF-bWaKr0.O_2qZqyfPRc0jn-RKmGfL9ICylDb6FIHVFUe_qqM2pk&dib_tag=se&gad_source=1&hvadid=700496652421&hvdev=c&hvlocphy=1009507&hvnetw=g&hvqmt=e&hvrand=6306356088730467156&hvtargid=kwd-2307416954109&hydadcr=27272_14738606&jp-ad-ap=0&keywords=%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AEjavascript%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8&qid=1736004404&sr=8-1
</details>