0
0

More than 1 year has passed since last update.

NameError: name ‘os’ is not definedが表示される場合の2つの解決法

Posted at

はじめに

僕はこのエラーに2回遭遇した経験があります。
1回目は、はじめてのDjango使用時にstartappしようとしたとき
2回目は、画像アップロード機能を追加するためsettings.pyにMEDIA_ROOTに以下の記述を追加し、migtateを実行したときです。

settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

両者とも同じ方法で解決することができました。
しかし2回目解決の際、1回目の解決法を思い出すことが出来ず調べていて、別の方法を発見しましたので、備忘録としてまとめます。
(思い出せなかった件がアカウント作成のきっかけでもあります。アウトプット、メモ書き大事)

解決方法

  1. settings.py内に import os を記述する
  2. os.pathを利用せず、BASE_DIR/ ' ' というpathlib形式で記入する

詳細

  1. の方法に関してはsettings.pyの最初の行にでも追記すればよいだけなので、非常に簡潔な方法ですね。startapp実行初期の状態では未記入の状態ですので、os.pathを利用する場合には忘れずに記入しましょう。

  2. の方法に関しては、Django 3.1以上で利用できる方法になります。
    Django3.1以降では、標準でpathlibというパッケージが入っています。
    pathlibはファイルやディレクトリを操作することができるライブラリになります。

settings.py
from pathlib import Path

Djangoに標準搭載につき、この記述を自分でする必要はありません。
また、記述量も少なく見やすくなります。

os.pathの場合
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
pathlibの場合
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR/'media'

また、今回の問題とは直接関係ありませんが、pathlib形式で記入することでBASE_DIRの記述方法も変化しています。ここは別記事でまとめようと思います。

どちらの場合でも動作自体は正しくすることが確認できましたが、 os.path と pathlib が混在している場合、500エラーというものが出る場合もあるそうです。

素人ながら、コードは短いに越したことは無いと思いますので、今後は pathlib を主に利用していきたいと考えています。
以上!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0