Как я могу получить полный / абсолютный URL (например https://example.com/some/path
) в Django без модуля Sites ? Это просто глупо ... Мне не нужно запрашивать мою БД, чтобы поймать URL!
Я хочу использовать это с reverse()
.
Как я могу получить полный / абсолютный URL (например https://example.com/some/path
) в Django без модуля Sites ? Это просто глупо ... Мне не нужно запрашивать мою БД, чтобы поймать URL!
Я хочу использовать это с reverse()
.
Ответы:
Используйте удобный метод request.build_absolute_uri () по запросу, передайте ему относительный URL, и он даст вам полный.
По умолчанию
request.get_full_path()
возвращается абсолютный URL-адрес для , но вы можете передать ему относительный URL-адрес в качестве первого аргумента, чтобы преобразовать его в абсолютный URL-адрес.источник
{{ request.build_absolute_uri }}{{ object.get_absolute_url }}
указать параметры) вы можете просто сделать это: - и heyho, полный URL.{% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}
потому что{{ request.build_absolute_uri }}
имел косую черту и{{ object.get_absolute_url }}
начал с косой черты, что привело к двойной косой черты в URL.Если вы хотите использовать его вместе с
reverse()
вами, вы можете сделать это:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
источник
url_name
а неview_name
)def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Вы также можете использовать
get_current_site
как часть приложения сайта (from django.contrib.sites.models import get_current_site
). Он принимает объект запроса и по умолчанию соответствует объекту сайта, который вы настроилиSITE_ID
в settings.py, если запрос естьNone
. Подробнее читайте в документации по использованию каркаса сайтовнапример
Он не такой компактный / аккуратный, как
request.build_absolute_url()
, но его можно использовать, когда объекты запроса недоступны, и у вас есть URL сайта по умолчанию.источник
django.contrib.sites
в вашейINSTALLED_APPS
, он не попал в БД на всех, и предоставить информацию , основанную на объекте запроса (см get_current_site )build_absolute_uri
все еще выглядит как более простое и чистое решение.Если вы не можете получить доступ к нему,
request
вы не можете использовать егоget_current_site(request)
в соответствии с рекомендациями, приведенными здесь. Вы можете использовать комбинацию нативной платформы Sites иget_absolute_url
вместо этого. Настройте хотя бы один сайт в администраторе, убедитесь, что в вашей модели есть метод get_absolute_url () , а затем:https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
источник
request
наNone
или позвонив по телефонуget_current_site(None)
.Если вы не хотите использовать базу данных, вы можете сделать это с настройкой. Затем используйте контекстный процессор, чтобы добавить его к каждому шаблону:
источник
По вашему мнению, просто сделайте это:
источник
django-fullurl
Если вы пытаетесь сделать это в шаблоне Django, я выпустил крошечный пакет PyPI,
django-fullurl
чтобы вы могли заменить тегиurl
иstatic
шаблоны наfullurl
иfullstatic
, например, так:Надеемся, что эти значки должны автоматически обновляться:
В представлении вы можете, конечно, использовать
request.build_absolute_uri
вместо этого.источник
request
объекта для получения доменного имени. В этом случае вы должныsites
вместо этого использовать платформу, которая получает имя домена из базы данных. Смотритеdjango-absoluteuri
, упомянуто в разделе «см. Также» README этого пакета PyPI.Чтобы создать полную ссылку на другую страницу из шаблона, вы можете использовать это:
request.META.HTTP_HOST дает имя хоста, а url дает относительное имя. Затем шаблонизатор объединяет их в полный URL-адрес.
источник
http
в данном контексте) и://
часть URL, поэтому он не предоставит полный URL-адрес .Еще один способ. Вы можете использовать
build_absolute_uri()
в своемview.py
и передать его в шаблон.view.py
ваш-template.html
источник
HttpRequest.build_absolute_uri(request)
эквивалентноrequest.build_absolute_uri()
не так ли?Изучите
Request.META
входящий словарь. Я думаю, что он имеет имя сервера и порт сервера.источник
Попробуйте следующий код:
источник
Это сработало для меня в моем шаблоне:
Мне нужен был полный URL, чтобы передать его в функцию js fetch. Я надеюсь, что это поможет вам.
источник
Я знаю, что это старый вопрос. Но я думаю, что люди все еще сталкиваются с этим.
Есть несколько библиотек, которые дополняют стандартную функциональность Django. Я попробовал несколько. Мне нравится следующая библиотека при обратной ссылке на абсолютные URL:
https://github.com/fusionbox/django-absoluteuri
Еще один, который мне нравится, потому что вы можете легко собрать домен, протокол и путь:
https://github.com/RRMoelker/django-full-url
Эта библиотека позволяет вам просто написать то, что вы хотите в своем шаблоне, например:
источник
Если вы используете django REST framework, вы можете использовать функцию reverse из
rest_framework.reverse
. Это поведение аналогично томуdjango.core.urlresolvers.reverse
, что он использует параметр запроса для создания полного URL-адреса.Отредактировано, чтобы упомянуть доступность только в структуре REST
источник
request=request
. Также не похоже, что запрос задокументирован здесь. Docs.djangoproject.com/en/1.9/ref/urlresolvers/#reverseЯ понял:
Получите полный URI со схемой, хостом, путем к порту и запросом.
источник
Также есть ABSOLUTE_URL_OVERRIDES, доступный как настройка
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
Но это переопределяет get_absolute_url (), что может быть нежелательно.
Вместо того, чтобы устанавливать фреймворк сайтов только для этого или делать некоторые другие вещи, упомянутые здесь, которые опираются на объект запроса, я думаю, что лучшее решение - поместить это в models.py
Определите BASE_URL в settings.py, затем импортируйте его в models.py и создайте абстрактный класс (или добавьте его к тому, который вы уже используете), который определяет get_truly_absolute_url (). Это может быть так просто, как:
Подкласс это и теперь вы можете использовать его везде.
источник
Как уже упоминалось в других ответах,
request.build_absolute_uri()
идеально подходит, если у вас есть доступrequest
, иsites
инфраструктура великолепна, если разные URL-адреса указывают на разные базы данных.Однако мой вариант использования был немного другим. Мой промежуточный сервер и рабочий сервер имеют доступ к одной и той же базе данных, но
get_current_site
оба вернули первыйsite
в базе данных. Чтобы решить эту проблему, вы должны использовать какую-то переменную окружения. Вы можете использовать 1) переменную окружения (что-то вродеos.environ.get('SITE_URL', 'localhost:8000')
) или 2) разныеSITE_ID
s для разных серверов И разные settings.py .Надеюсь, кто-то найдет это полезным!
источник
Я наткнулся на эту тему, потому что я искал абсолютный URI для страницы успеха.
request.build_absolute_uri()
дал мне URI для моего текущего представления, но чтобы получить URI для моего успешного просмотра, я использовал следующее ....request.build_absolute_uri (обратный ( 'success_view_name'))
источник
request.get_host()
даст вам домен.источник
Вы также можете использовать:
Это работает нормально для меня,
Я не совсем уверен, как это работает. Я полагаю, что это немного более низкий уровень и будет возвращать имя хоста вашего сервера, которое может отличаться от имени хоста, используемого вашим пользователем для перехода на вашу страницу.
источник
Вы можете попробовать "request.get_full_path ()"
источник