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

#python #django #authentication

Вопрос:

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

корневой URLconf

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

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

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

Каким-то образом это заканчивается на » войти/», и 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 первый » «, включает(«аутентификация.url»)) будет соответствовать ему. И все начинается сначала.

  1. Когда и почему «», включая(«URL-адреса приложений») будут совпадать?
  2. Когда «», включая(«authentication.url»), совпадает, откуда берется » вход/»?
  3. Перенаправление на «/» в login_view() не создает цикл, почему?

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

Ответ №1:

Потому что, когда вы идете в 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/ .

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

 # app/urls.py

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

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