0_terarin_0
@0_terarin_0 (Koki Teramoto)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Django】Path()の()をつけない理由は?

Q&A

Closed

解決したいこと

PythonおよびDjangoを勉強中です。
urls.pyにおいてなぜ関数のview()()をつけないのでしょう?
なお、関数ベースビューです。

発生している問題・エラー

なぜこのようになるのかがわかりません。

該当するソースコード

views.py
from django.shortcuts import render
def index_view(request):
    return render(request, 'index.html')
urls.py
from django.urls import path 
from . import views
app_name = 'APP_NAME'
urlpatterns = [
    path('', views.index_view, name='index'),
]

自分で試したこと

views.index_view()をつけましたが、何を引数に渡したらいいのかがわからず、そのまま実行するとエラーを吐きます。

0

3Answer

渡したいのは views.index_view を呼び出した結果ではなく views.index_view そのものだからです。 関数もまた関数というオブジェクトとして変数に格納したり引数として渡したりできます。

2Like

Comments

  1. @0_terarin_0

    Questioner

    ご回答ありがとうございます。
    関数をオブジェクトとして扱うときは因数を指定しないからなんですね、よくわかりました!

関数はカッコをつけなければ呼び出さないままでオブジェクトとして扱えます。また関数オブジェクトを代入した変数にカッコをつけて関数を呼び出すことができます。

x = views.index_view
x(request) # ここで index_view 関数が呼び出される

path('', views.index_view, name='index'), では、関数オブジェクト views.index_viewpath() の引数に渡しています。関数は path() の内部で後々呼び出されます。

2Like

Comments

  1. @0_terarin_0

    Questioner

    ご回答ありがとうございます。
    なるほど、オブジェクトとして扱うことができるのですね!
    勉強になります、ありがとうございます。

最近、djangoを勉強しています。
flaskに対して超ムズ感なので敬遠してました。

さて、プロジェクトフォルダに wsgi.pyがあり、その中のapplicationがwebサーバから直接呼ばれるのですが、
(例えばgunicorn,uWSGI)

このapplicationがチェーンのようにindex_viewと繋がっていています。その役割を果たしているのがsettings.pyと2つのurls.pyです。
つまり、webサーバはapplicationを実行したつもりでも、実際はその先の先の先であるindex_viewを直接実行しています。
よって、引数内でindex_view()を実行して引数の結果が引数として設定され、webサーバは関数として実行できなくなります。

1Like

Comments

  1. @0_terarin_0

    Questioner

    ご回答ありがとうございます。
    なるほど、Webサーバーには関数を渡す必要があるからですね。
    数学と似通ってる部分を感じました。
    わかりやすい説明をありがとうございます!

Your answer might help someone💌