Почему URL-адреса django заканчиваются косой чертой?

Официальная документация Django и другие учебные материалы в Интернете всегда используют косую черту в конце URL. например:

url(r'^accounts/login/', views.login)  # login view in turn calls login.html

# instead of

url(r'^accounts/login', views.login)

Поскольку accounts является каталог и login (login.html) это файл, мы не должны использовать второй URL? Это также сделает параметры GET более структурированными:

accounts/login?name='abc'  # login is a file that is accepting parameters
vs.
accounts/login/?name='abc' # login directory (maybe index) is accepting parameters??

Ответ 1

Одна из основных философий Djangos - URL должны быть красивыми.

Таким образом, некоторые URL-адреса, такие как accounts/detail?name='abc' должны отображаться как accounts/detail/abc/. Вы можете захватить его с помощью регулярных выражений в ваших конфигурациях URL. Здесь URL довольно аккуратный и удобный для пользователя. Это поможет поисковым системам правильно проиндексировать ваши страницы (теперь вы можете забыть о rel=canonical) и поможет в SEO.

Теперь причину косой черты рассмотрим представление (в любой about.html), которое относительно разрешает about.html для пользователя по пути users/awesomeUser

так как users/awesomeUser и users/awesomeUser/ отличаются,

  1. Если пользователь находится в users/awesomeUser, браузер разрешит его как users/about.html потому что нет косой черты, которая нам не нужна

  2. Если пользователь находится в users/awesomeUser/, браузер разрешит его как users/awesomeUser/about.html потому что есть косая черта

  • child отношению к family/parent/ является family/parent/child.
  • child отношению к family/parent - это family/child.

Философия дизайна Django на "Определенных URL" гласит:

Технически, foo.com/bar и foo.com/bar/ - это два разных URL-адреса, и роботы поисковых систем (и некоторые инструменты анализа веб-трафика) будут рассматривать их как отдельные страницы. Django должен приложить усилия для "нормализации" URL, чтобы роботы поисковых систем не запутались.

Это обоснование настройки APPEND_SLASH. (APPEND_SLASH позволяет принудительно добавлять косые черты в URL)

Все еще не убежден?

  1. Поскольку django рассматривает оба URL как разные, если вы кэшируете свое приложение, Django сохранит две копии для одной и той же страницы в user/awesomeUser и user/awesomeUser/.
  2. У вас должны быть проблемы с методами HTTP, отличными от GET, если вы не добавляете косую черту в URL (если вы когда-либо планируете создать REST API).

Обновить

Вы не можете заставить методы POST/PUT/PATCH/DELETE работать с rest_framework если вы явно не определили APPEND_SLASH=False в настройках и trailing_slash=False для каждого маршрутизатора, который вы должны использовать (если вы используете Routers). Как будто ты в основном пропустишь это большую часть времени, и тебе придется потратить кучу времени на отладку этого. Джанго рекомендует append slashes и не заставляет их.

Это до разработчика, чтобы добавить косые черты или нет.

Ответ 2

Это помогает определить структуру вашего сайта. Хотя django может поддерживать что-либо, введенное после того, как домен, который передается серверу, делает это таким образом, позволяет легко добавлять "подстраницы" к URL-адресу, не выглядя как accounts/loginreset?id=alkfjahgouasfjvn25jk1k25

Как сказано в вышеприведенном случае, имеет смысл оставить это.

Ответ 3

От документы для промежуточного программного обеспечения, которое использует APPEND_SLASH

индексатор поисковых машин будет рассматривать их как отдельные URL-адреса, поэтому лучше всего нормализовать URL-адреса.

Не требуется django, просто пытается помочь вашему SEO, предлагая стандартный способ делать URL-адреса.

Да, я знаю, что косая черта не имеет ничего общего с этим промежуточным программным обеспечением, но это лучшее объяснение, которое я могу найти по возможной причине.

Ответ 4

"URL должны быть красивыми" !!! Я хочу иметь возможность контролировать URL. Ничего приятного, когда все собирается переписать. При определенных обстоятельствах я делаю цикл перенаправления, что не смешно.

from django.http import HttpResponseRedirect as rdrct

url(r'^sitemap.xml$', 'my_app.views.custom_sm'),

url(r'^sitemap.xml/$', lambda x: rdrct('/sitemap.xml')),