#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»)) будет соответствовать ему. И все начинается сначала.
- Когда и почему «», включая(«URL-адреса приложений») будут совпадать?
- Когда «», включая(«authentication.url»), совпадает, откуда берется » вход/»?
- Перенаправление на «/» в 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
представление.