Django - ссылки, созданные с помощью {% url%} - как сделать их безопасными?

Если я хочу предоставить пользователям возможность входа на веб-сайт с помощью https:// вместо http://, я бы лучше дал им возможность получить доступ к моему представлению или шаблону.

Я хотел бы иметь ссылку "Использовать безопасное соединение" на моей странице входа в систему - но тогда, как мне это сделать без жесткого кодирования URL?

Я хотел бы иметь возможность просто:

{% url login_page %}
{% url login_page_https %} 

и укажите их на http://example.com/login и https://example.com/login.

Как я могу это сделать?

Ответ 1

Тег {% url %} генерирует только часть пути URL-адреса, а не часть узла. Он генерирует нечто вроде "/path/to/here" (все, что вам нужно сделать, это "источник просмотра", и вы увидите, что все содержимое href). Это ваш браузер, который предполагает, что если вы в настоящее время находитесь на http://example.com, ссылка также должна быть в пределах http://example.com. Итак, все, что вам нужно сделать для создания безопасной ссылки в вашем шаблоне, это:

<a href="https://example.com{% url blah %}">

Если вы не хотите жестко указывать имя домена (а я бы не стал), вы можете использовать объект сайта и это выглядит примерно так:

<a href="https://{{ site.domain }}{% url blah %}">

Или, если вы не хотите использовать инфраструктуру сайтов, вы можете использовать request.get_host:

<a href="https://{{ request.get_host }}{% url blah %}">

Ответ 2

Я не много работал с защищенными URL-адресами, но я немного поработал с satchmo, у которого есть промежуточное ПО и некоторые утилиты для него. Среднее программное обеспечение просто проверяет ключ SSL = True в параметрах представления и делает запрос безопасным таким образом. Вам, вероятно, не нужно делать это сложным, но вы можете посмотреть, как это реализовано.

Satchmo находится на битбакете здесь

Мне также удалось найти фрагменты для middlewares, которые также должны помочь вам получить безопасный URL-адрес для входа:

Первый - это оригинал, в то время как второй должен быть улучшенной версией, в какой-то момент, но может и не быть. Вы можете взглянуть на них.

Используя либо satchmo, либо один из фрагментов промежуточного программного обеспечения, вы можете сделать что-то вроде

{% url login_page %}
{% url login_page SSL=1 %}

Ответ 3

Возможно, вы могли бы написать тег url_https, который делает то же самое, что и url, но указывает на HTTPS-версию URL-адреса.