Как я могу получить полный / абсолютный URL (с доменом) в Django? - PullRequest
331 голосов
/ 27 февраля 2010

Как получить полный / абсолютный URL (например, https://example.com/some/path) в Django без модуля Sites ? Это просто глупо ... Мне не нужно запрашивать мою БД, чтобы поймать URL!

Я хочу использовать его с reverse().

Ответы [ 19 ]

5 голосов
/ 06 июня 2015

Я знаю, что это старый вопрос. Но я думаю, что люди все еще сталкиваются с этим.

Существует несколько библиотек, которые дополняют стандартную функциональность Django. Я попробовал несколько. Мне нравится следующая библиотека при обратной ссылке на абсолютные URL:

https://github.com/fusionbox/django-absoluteuri

Еще один мне нравится, потому что вы можете легко собрать домен, протокол и путь:

https://github.com/RRMoelker/django-full-url

Эта библиотека позволяет вам просто написать, что вы хотите в своем шаблоне, например ::

{{url_parts.domain}}
5 голосов
/ 19 августа 2016

Попробуйте следующий код:

{{ request.scheme }}://{{ request.META.HTTP_HOST }}
3 голосов
/ 28 декабря 2018

Это сработало для меня в моем шаблоне:

{{ request.scheme }}:{{ request.META.HTTP_HOST }}{% url  'equipos:marca_filter' %}

Мне нужен был полный URL, чтобы передать его в функцию js fetch. Я надеюсь, что это поможет вам.

2 голосов
/ 07 мая 2016

Если вы используете django REST framework, вы можете использовать обратную функцию из rest_framework.reverse. Это поведение аналогично django.core.urlresolvers.reverse, за исключением того, что он использует параметр запроса для создания полного URL.

from rest_framework.reverse import reverse

# returns the full url
url = reverse('view_name', args=(obj.pk,), request=request)

# returns only the relative url
url = reverse('view_name', args=(obj.pk,))

Отредактировано для упоминания доступности только в среде REST

1 голос
/ 19 апреля 2016

Я понял:

wsgiref.util.request_uri(request.META)

Получить полный URI со схемой, хостом, путем к порту и запросом.

0 голосов
/ 17 января 2019

Существует также 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 (). Это может быть так просто, как:

def get_truly_absolute_url(self):
    return BASE_URL + self.get_absolute_url()

Подкласс это, и теперь вы можете использовать его везде.

0 голосов
/ 21 ноября 2012

Вы можете попробовать "request.get_full_path ()"

0 голосов
/ 07 июля 2015

request.get_host() даст вам домен.

0 голосов
/ 18 апреля 2016

Вы также можете использовать:

import socket
socket.gethostname()

Это нормально работает для меня,

Я не совсем уверен, как это работает. Я полагаю, что это немного более низкий уровень и будет возвращать имя хоста вашего сервера, которое может отличаться от имени хоста, используемого вашим пользователем для перехода на вашу страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...