Python の Django の開発をやっていると Page not Found (404) のエラーには頻繁に遭遇すると思います。
下記のようなメッセージと黄色い画面ですね。
URLconf defined in config.urls
, Django tried these URL patterns, in this order
慣れている人は簡単に解消しますが、慣れていない人は地味にハマる部分だと思うので記事にしました。
本記事ではエラーの解消にフォーカスを当てていて、とりあえずエラーを解消するという観点で書いています。
そのため、「あるべき実装はこれ!」のようなアプリとしての内部品質の部分には触れていません。
Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学ぶオンライン講座
Python Djangoの Page not found を解決する方法
基本的にはブラウザに打ち込んだ URL と urls.py で書かれている URL が異なっていることが原因です。
前提として今回のサンプルで用意したアプリのファイル構成は下記のようになっています。
※今回の説明と関係ないファイルは省略しています。
sample_site/
├ config/
│ └ urls.py
└ sample_page/
└ urls.py
URLで定義したViewを指定していない場合とその対処法①
まず下記のURLで接続できない場合の対処方法です。
http://localhost:8000
が接続できなくなった場合は、config/urls.py の中身を確認します。
# config/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('sample_page/', include('sample_page.urls')),
]
config/urls.py の urlpatterns の path 関数の第一引数が上記のように何かしら(admin/ とか sample_page/ とか)定義されている場合はURLにそこに書かれている文字をURLにそのまま打ち込む必要があります。
ですので今回の場合ですと下記のように明示的にViewの名前まで記載する必要があります。
※最後の/スラッシュの有無もそのまま書くようにしてください。
http://localhost:8000/admin/
または
http://localhost:8000/sample_page/
これでエラーは解消します。解消しない場合は別の問題が発生している可能性があるので、本記事の後続の対処法も試してみてください。
URLで定義したViewを指定していない場合とその対処法②
①と少し似ています。path で定義されているものをURLに忠実に打ち込まないと Page not Found エラーは発生します。
ですので下記のように定義した場合は定義されているView名をURLにしっかりと記載する必要があります。
# sample_page/urls.py
urlpatterns = [
path('sample_class/', hello, name='HelloWorld!!!'),
path('sample_func/', hello_world, name='HelloWorldFunc!!!!')
]
ですので下記のURLでページを開こうとしてもエラーが発生します。
http://localhost:8000/sample_page/
この場合は下記URLのようにViewの名前をURLに入力すれば問題はありません。
http://localhost:8000/sample_page/sample_class/
ですが、View を URL に入力しなくても、その下に配置してあるViewを表示したい場合もあると思います。
その場合は下記のように空文字で開くページを用意すればエラーは解消します。
urlpatterns = [
path('', hello_world_index, name='HelloWorldIndex!!!'),
path('sample_class/', hello, name='HelloWorld!!!'),
path('sample_func/', hello_world, name='HelloWorldFunc!!!!')
]
上記のように設定することで、下記のようなURLでもエラーが解消するようになります。
http://localhost:8000/sample_page/
スラッシュの有無が定義とURLで一致していない場合
さっきのパターンと似ています。というよりほぼ同じです。
# config/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('sample_page', include('sample_page.urls')),
]
と実装していて(sample_page の後ろのスラッシュがないバージョン)
http://localhost:8000/sample_page/
で接続を試みてエラーが発生している場合はURLもしくは urlpatterns に定義されている path のスラッシュを確認します。
今回の場合は config/urls.py で設定されている sample_page にはスラッシュがないので、URL からスラッシュを消すか、定義にスラッシュを足すかの対応が必要です。
URL を修正する場合は下記のように修正するとエラーは解消します。(最後のスラッシュを削除)
http://localhost:8000/sample_page
path の定義を修正する場合は下記のように修正をすると解消します。
# sample_page -> sample_page/ (最後にスラッシュを追加)
urlpatterns = [
path('admin/', admin.site.urls),
path('sample_page/', include('sample_page.urls')),
]
その他の場合
その他には下記のような事象が原因である可能性があります。
まとめ
今回はPythonのDjangoアプリ開発中の Page not Found (404) の場合のエラーの対処法を紹介しました。
基本的には初歩的なミスであることが多いため、しっかりと1つずつ確認をすればエラーを解消することは容易だと思います。
今回はとにかくエラーを解消することにフォーカスを当てて記事を作成しています。
ですのであるべき実装、エラーの発生リスクを下げるため実装などには触れていません。
内部品質的な観点での記事は、後日作成しようと思います。
皆様の役に立ちますと幸いです。
コメント