Ответ 1
Отслеживание показывает, что именно сопоставление маршрутов вызвало перенаправление; обычно (например, если вы не добавили явные маршруты перенаправления), это означает, что клиент попытался получить доступ к URL-адресу ветки (тот, который заканчивается конечной косой чертой), но запрошенный URL-адрес не включал последнюю косую черту. Клиент просто перенаправляется на URL-адрес канонической ветки с косой чертой.
Правила URL, которые заканчиваются косой чертой, - это URL-адреса ветвей, другие - листья. Если у вас включен
strict_slashes
(который по умолчанию), все ветки-адреса, совпадающие без конечной косой черты, вызовут перенаправление на тот же URL-адрес с добавленным отсутствующим косой чертой.
Из документации по маршрутизации:
Правила URL флагов основаны на модуле маршрутизации Werkzeugs. Идея этого модуля заключается в том, чтобы обеспечить красивые и уникальные URL-адреса на основе прецедентов, установленных Apache и более ранними HTTP-серверами.
Возьмите эти два правила:
@app.route('/projects/') def projects(): return 'The project page' @app.route('/about') def about(): return 'The about page'
Хотя они выглядят довольно схожими, они отличаются использованием конечной косой черты в определении URL. В первом случае канонический URL-адрес для конечной точки проекта имеет завершающую косую черту. В этом смысле он похож на папку в файловой системе. Доступ к нему без завершающей косой черты приведет к тому, что Flask будет перенаправлен на канонический URL-адрес с завершающей косой чертой.
Во втором случае URL-адрес определен без конечной косой черты, скорее как путь к файлу в UNIX-подобных системах. Доступ к URL-адресу с завершающей косой чертой приведет к ошибке 404 "Not Found".
Это позволяет относительным URL-адресам продолжать работать, даже если завершающая косая черта оммитирована, в соответствии с тем, как работают Apache и другие серверы. Кроме того, URL-адреса останутся уникальными, что поможет поисковым системам не индексировать одну и ту же страницу дважды.
Как указано в документе, если вы не хотите этого поведения (и вместо URL-адреса, у которого нет косой черты, вместо 404 Not Found), вы должны установить опцию strict_slashes=False
на вашем маршруте.