Как работает поток аутентификации в Django? [конкретный случай]

Я читаю некоторый код, найденный в Интернете, и пытаюсь разобраться в нем. Я не понимаю, как здесь работает аутентификация. Вот фрагменты кода.

корень URLConf

urlpatterns = [
    path('admin/', admin.site.urls),          
    path("", include("authentication.urls")), 
    path("", include("app.urls"))             
]

Тогда, если мы посмотрим на authentication.urls, мы увидим следующее:

urlpatterns = [
    path('login/', login_view, name="login"),
    path('register/', register_user, name="register"),
    path("logout/", LogoutView.as_view(), name="logout")
]

Почему-то он заканчивается на 'login/' и login_view обрабатывает его. Я не понимаю, почему? Хорошо, тогда если мы откроем login_view:

def login_view(request):
    form = LoginForm(request.POST or None)

    msg = None

    if request.method == "POST":

        if form.is_valid():
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("password")
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect("/")
            else:    
                msg = 'Invalid credentials'    
        else:
            msg = 'Error validating the form'    

    return render(request, "accounts/login.html", {"form": form, "msg" : msg})

мы видим, что в случае успешной аутентификации он перенаправляет на "/", что, как я понимаю, должно создать цикл. Потому что, когда вы перейдете на http://localhost:8000, первый " ", include("authentication.urls")) будет соответствовать ему. И все начнется сначала.

  1. When and why "", include("app.urls") will match?
  2. When "", include("authentication.urls") matches, where does 'login/' come from?
  3. Redirecting to "/" in login_view() doesn't create a loop, why?

По сути, я не понимаю, как работает все это решение, и буду признателен за любые объяснения.

Потому что, когда вы переходите к http://localhost:8000 первому " ", include("authentication.urls")).

Нет, include('authentication.urls') будет пытаться сопоставить оставшийся элемент, здесь / с шаблонами url модуля authentication.urls, так что это вызовет просмотр только в том случае, если оставшаяся строка будет login/, register/ и logout/.

Таким образом, вы можете увидеть пустую строку в операторе include:

#    ↓↓ prefix
path('',  include('authentication.urls'))

как префикс. Но urls.py содержит urlpatterns и должен соответствовать оставшейся строке (строке после вычеркивания '' из начала строки в данном случае).

Это означает, что / будет не активировать представление, указанное в authentication.urls, поскольку оно требует login/, logout/ или register/.

Это означает, что Django будет продолжать искать и, вероятно, найдет путь в app.urls, который выглядит так:

# app/urls.py

urlpatterns = [
    # ⋮,
    path('/', some_view, name='some-name')
    # ⋮
]

и таким образом активировать представление some_view.

Вернуться на верх