В чем разница между URL со слэшем на конце и без него в Django?

Ответ

Ключевое различие заключается в настройке Django APPEND_SLASH, которая по умолчанию установлена в True.

Когда APPEND_SLASH = True:

  1. Если пользователь запрашивает URL без слэша на конце (например, /articles), а в urls.py определен шаблон со слэшем (path('articles/', ...)), Django автоматически выполнит 301 редирект на /articles/.
  2. Это сделано для обеспечения каноничности URL, чтобы поисковые системы не индексировали одну и ту же страницу по двум разным адресам.

Пример (urls.py):

from django.urls import path
from . import views

urlpatterns = [
    # Шаблон определен со слэшем
    path('articles/', views.article_list, name='article-list'),
]
  • Запрос на /articles301 Redirect на /articles/
  • Запрос на /articles/200 OK

Если установить APPEND_SLASH = False в settings.py, то при запросе на /articles будет возвращена ошибка 404 Not Found.

Ответ 18+ 🔞

Да ты посмотри, какая заковыка-то, блядь! Всё дело в этой настройке Django, которая APPEND_SLASH. Она по дефолту, как здоровый лось, стоит на True, и вот что из этого выходит, ёпта!

Когда эта штука включена, происходит следующее, блядь:

  1. Допустим, какой-то распиздяй запросил у тебя адрес без слеша, типа /articles. А у тебя в urls.py этот путь записан со слешом, как порядочный человек — 'articles/'. Так вот, Django, видя это безобразие, не моргнув глазом, делает 301 редирект на правильный адрес, /articles/.
  2. Всё это ради, блядь, каноничности URL, чтобы поисковики, эти мудозвоны, не индексировали одну и ту же страницу по двум разным адресам. Чистота, блядь, порядок!

Вот смотри, пример (urls.py):

from django.urls import path
from . import views

urlpatterns = [
    # Шаблон определен со слэшем
    path('articles/', views.article_list, name='article-list'),
]
  • Запрос на /articles301 Redirect на /articles/ (Вот тебе, неуч, учи матчасть!)
  • Запрос на /articles/200 OK (Молодец, красава, всё правильно сделал)

А теперь представь, ты взял и в settings.py вырубил эту фичу, поставил APPEND_SLASH = False. Что будет? А будет пиздец, блядь! Тот же запрос на /articles упрётся рогом в 404 Not Found. Ищи-свищи свою страницу, волк тебя дери! Вот так вот, в рот меня чих-пых, одна настройка — и всё летит в тартарары.