メニュー 閉じる

Python Djangoの環境構築や最初やってしまったミス

この記事は頭から読んでも体系的に問題解決ができるものではありません。
これに困っている!とGoogle検索したときに参考にする程度のメモです。

主に初歩的なところで躓いてしまうことの多いポイントについてまとめました。

 

Anacondaとかpyenvとかを使う必要はあるの?

 

早速「Anacondaが〜」とかいう呪文タイトルで申し訳ないのですが、
バージョン管理をしたい理由が思いつかないという人は最初は入れないでいいです。

開発する際にこうしたパッケージマネージャーを使わずそのまま環境構築を行っても大丈夫です。
というより、最初はそのまま環境構築をした方が良いと思います。

普通にその使いたい言語の公式からダウンロードして、そのままインストールすればOKです。

実はWebで紹介されている環境構築方法は複数に渡っています。

それぞれ理由があるのですが、書いてある通りに従っていると、
ローカル開発環境に別のOSを使うようにセットアップされていたり、
言語のバージョン管理アプリがセットアップされていたりします。

後々、とても便利なものなのですが、最初はこうした開発支援ツールは手に余るところがあります。

例えばHello Worldを動かすだけが目標なのに、
様々なパッケージマネージャーをインストールすると、
何もできないうちに、そのパッケージマネージャーの使い方やエラー等で躓いてしまい、
どんどん開発が難しくなるので挫折します(経験談)
結局、使いこなせなくてクリーンインストールしたくなります。

とりあえず使いたい言語をまず公式からダウンロードしてインストールすることです。
PythonやDjangoくらいメジャーだと公式からソフトのようにダウンロードできます。

チュートリアルなどを進めていく上で進まなくなったら、
そのつど必要なものをpipコマンドなどで入れていくといいと思います。

最小限の使うものだけを入れて環境構築をすることをおすすめします。
(実際はそれ前提で書かれている記事が少ないから難しいのだけど…)

 

Anaconda環境にpipでパッケージをインストールする
https://qiita.com/mckeeeen/items/d4cbe4a16a102157f40c

 

そもそもモジュールとかパッケージって何?

 

単に複雑さという視点だけで見れば、

 

関数<モジュール<パッケージ≦ライブラリ

 

でも、指している粒度がかなりバラバラでちょっと説明がむずかしい。

だいたいのイメージで言えば関数が集まってモジュールになり、
モジュールが集まって、公式に認められるとpipでインストールできるパッケージになり、

パッケージが集まって、ライブラリになるということです。

だから、パッケージが入っているとその中のモジュールは使えるようになる。

 

フレームワークはいろいろなパッケージやライブラリだけではなく、
わざと全体の構成をあえて厳し目に指定しておくことで、
多人数でWebアプリケーション開発をやりやすくする開発おすすめセットみたいなものです。

当然だけれどもフレームワークを入れるとその中のモジュールは使える。

例えばWebアプリ開発に特化した限りなく公式な開発おすすめセットとなっているのが、
Ruby on RailsとかNuxt.jsとかDjangoといったフレームワークです。

 

面白いのは大きさ的にはDjangoというのは巨大なのだけれど、
Pythonのパッケージとして提供されています。

だから、Djangoはパッケージの一つとしてpipでインストールできます。
(当然Djangoをインストールするとその中の色々なパッケージが全部まるごと一気にインストールされるよ!)

なんとなく、そんな感じだということだけれども、
最初は別に気にしないでいろいろな人のコードを真似していくうちにこの記事を見つけてくれたら嬉しいな。

 

Anacondaを利用した環境でパッケージを使うには?


すこし、かじったことがある人はバージョン管理をしているかもしれません。

例えばAnacondaを使っている人が最初は必ずターミナルを開いたときに確認することがあります。
まず、自分がいま使っているのが仮想環境かどうかを確認することです。

例えばターミナルを開いたときに最初から以下のようなコマンドが表示されます。
簡単にはこのように()が頭についているときはAnacondaの仮想環境を利用しています。

(django) linda@lindaMBP %

普通のローカル(自分のPCに直接環境を作っている)を使う際は以下のような表示です。

Last login: Tue Nov  3 12:13:05 on ttys000

linda@lindaMBP ~ %

違いがわかりましたか?

Anacondaをインストールすると自動的にAnacondaの仮想環境を優先して使うようになります。
別にそのままでいいという人はそのままでいいのですが、

$ conda deactivate

すると、先程お見せしたいわゆる普通のローカル開発環境のターミナルが使えます。

応用編ですがAnacondaでdatascience用のパッケージをインストールしたPythonを使いたければ、
まず、Anaconda Navigatorなどで必要なパッケージをすべてインストールした上で、

$ conda env list
※これでdatascienceの環境があることを確認して
$ conda activate datascience

というコマンドでdatascience用のパッケージがインストールされている環境を起動できます。

別に全部のパッケージを入れ込んでしまえばいいような気がしますが、
パッケージによっては相互依存していたりすることや、
できるだけエラー発生時に問題解決をしやすくするため分けることが多いと思います。

例えば私の場合はdatascienceには科学技術計算やデータサイエンス用のパッケージが入っており、
djangoにはdjangoの開発でつかうパッケージが入っています。

 

Pythonに何のパッケージが入っているか知りたい

 

例えば今使っているDjangoのバージョンを知りたいときはどうするか?

$ pip list

#Anacondaを使っている場合は
$ conda list

pipというコマンドはPython Package Indexに登録されているパッケージの、
インストールや削除等に用いられるコマンドで、
最近Pythonをインストールしたら最初から使えます。

※Python3.4以上(Python2の場合は2.7.9以上)に初期インストール済み

 

よくあるNo Module namedエラーの原因

$ python manage.py runserver

もしくは

$ python manage.py make migration
ModuleNotFoundError: No module named 'chat'

最後の’なんとか’で囲まれている部分のPythonモジュールが存在しないというエラーです。

「モジュール」とはなんぞやというところから知っておく必要がありますが簡単です。
.pyの拡張子が付いているファイル、すなわちPythonファイルです。

とは言っても自分で作った覚えがない人がほとんどだと思います。
実はだいたいモジュールとはDjangoをインストールしたときに勝手に作られているからです。

importなんちゃらとかいうのはモジュールをインポートするということです。
これは自分で作ったファイルを使うこともできますし、誰かの作ったモジュールを使うこともできます。

もちろん、自分のPCにそのモジュールが入ってないと使えません。
パッケージというのは誰かがみんなのために公開してくれてる.pyファイルの集まりで、
普通に使うときはDjangoなどのフレームワークをインストールすると、自動的に使えるようになります。

 

Python基礎講座(14 モジュールとパッケージ)
https://qiita.com/Usek/items/86edfa0835292c80fff5

 

ModuleNotFoundErrorはディレクトリが間違ってる

 

例えばチュートリアルどおりにつくっていてそれでもこのエラーが出たときは、

「フォルダ名、ファイル名のタイプミス」もしくは、
「そのアプリを構成するフォルダの場所が間違っている」

ということが多いです。

Django でrunserverしてこのエラーが出るということは、
Djangoが理解できる構成になってない可能性が高いということです。

対処法は意外と簡単。Finderでその開発しているフォルダを開いて、
ドラッグ・アンド・ドロップで正しそうなところに置き直してあげることです。

(ここで無理にCUIで動かしたりしようとしてはダメ!
勉強になるけれど難しくなるよ!)

あとは「urls.py」が「url.py」になっているようなファイル名のチェックですね。

こういうことが起きやすいきっかけとしては、例えば自分が今いるディレクトリを確認せずに、
以下のアプリ作成コマンドを打ったときなどがありえると思います。

$ python manage.py startapp newapp

このコマンド自体は正しく動作しますが、
projectstartしたときに自動生成されたmanage.pyが作成されている階層ではないところで、
このコマンドでアプリを作成するとアプリを正しく起動させることができません。

何度修正しても、うまく行かないときはそのファイルの置いてある場所を確認しましょう。
別に全部削除しなくてもそのコマンドで作成されたアプリのフォルダだけ、
ドラッグ・アンド・ドロップして正しいディレクトリに置いてあげればたいてい直ります。

 

Django TypeError: argument of type ‘PosixPath’ is not iterable

 

以前作成した別の環境、Django2.2.5で新しいアプリを作成しようとしたところ、
見出しのエラーが発生しました。

現在の最新であるDjango3.1.2ではこのようなエラーは発生しません。

$ python manage.py startapp helloworldapp

Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 336, in run_from_argv
connections.close_all()
File "/usr/lib/python3/dist-packages/django/db/utils.py", line 224, in close_all
connection.close()
File "/usr/lib/python3/dist-packages/django/db/backends/sqlite3/base.py", line 248, in close
if not self.is_in_memory_db():
File "/usr/lib/python3/dist-packages/django/db/backends/sqlite3/base.py", line 367, in is_in_memory_db
return self.creation.is_in_memory_db(self.settings_dict['NAME'])
File "/usr/lib/python3/dist-packages/django/db/backends/sqlite3/creation.py", line 12, in is_in_memory_db
return database_name == ':memory:' or 'mode=memory' in database_name
TypeError: argument of type 'PosixPath' is not iterable

詳しくは分かりませんが、Django3.1までで発生するデータベースの設定系のエラーだそうです。
PosixPathでDjango3系ではString型に設定する必要があるそうです。

バージョンの関係でどうしてもDjango3.1以前を使わなければならないという場合は、
下記のブログを参考にして設定を行って下さい。

 

Use Pathlib in Your Django Settings File
https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/

 

DjangoでStartprojectをするとフォルダを1階層深く作ってしまう

 

これは最初Djangoで意気揚々とプロジェクトを作成するとめっちゃあるあるでした。

統合開発環境では左側にエクスプローラーが表示されるのですぐ気づけますが、
例えばtestprojectフォルダ内で開発を行おうと思ってその直下でstartprojectを行うと、
testoproject/testprojectと一階層深くなってしまうのです。

この問題を避けるには、startprojectのあとのプロジェクト名の後ろにドットを打つことです。

$ django-admin startproject projectname .

[Django]startprojectをした時にカレントディレクトリ下に無駄にディレクトリが作られることを防ぐ
https://qiita.com/digitalhimiko/items/6fa71d1a2eaec186698b

 

VS Codeでターミナルを開いたときのフォルダの初期位置を設定する

 

VS Codeの「設定」画面を開き、”Search Settings” で “terminal.integrated.cwd”で検索。
表示された欄に初期で開きたいフォルダのパスをコピペする。

 

Changing the default path of Visual Studio Code’s integrated terminal
https://stackoverflow.com/questions/43305050/changing-the-default-path-of-visual-studio-codes-integrated-terminal