Вопрос:

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

django

244205 просмотра

19 ответа

134925 Репутация автора

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

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

Автор: mpen Источник Размещён: 27.02.2010 12:28

Ответы (19)


7 плюса

12183 Репутация автора

Изучите Request.METAвходящий словарь. Я думаю, что он имеет имя сервера и порт сервера.

Автор: Kugel Размещён: 27.02.2010 12:53

484 плюса

25564 Репутация автора

Решение

Используйте удобный метод request.build_absolute_uri () по запросу, передайте ему относительный URL, и он даст вам полный.

По умолчанию request.get_full_path()возвращается абсолютный URL-адрес для , но вы можете передать ему относительный URL-адрес в качестве первого аргумента, чтобы преобразовать его в абсолютный URL-адрес.

Автор: Dmitry Shevchenko Размещён: 27.02.2010 02:00

56 плюса

1135 Репутация автора

Вы также можете использовать get_current_siteкак часть приложения сайта ( from django.contrib.sites.models import get_current_site). Он принимает объект запроса и по умолчанию соответствует объекту сайта, который вы настроили SITE_IDв settings.py, если запрос есть None. Подробнее читайте в документации по использованию каркаса сайтов

например

from django.contrib.sites.shortcuts import get_current_site
request = None
full_url = ''.join(['http://', get_current_site(request).domain, obj.get_absolute_url()])

Он не такой компактный / аккуратный, как request.build_absolute_url(), но его можно использовать, когда объекты запроса недоступны, и у вас есть URL сайта по умолчанию.

Автор: Darb Размещён: 11.01.2012 10:44

-4 плюса

269 Репутация автора

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

Автор: Max Ferreira Размещён: 21.11.2012 03:34

84 плюса

1428 Репутация автора

Если вы хотите использовать его вместе с reverse()вами, вы можете сделать это:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))

Автор: ébewè Размещён: 23.08.2013 07:07

53 плюса

9346 Репутация автора

Если вы не можете получить доступ к нему, requestвы не можете использовать его get_current_site(request)в соответствии с рекомендациями, приведенными здесь. Вы можете использовать комбинацию родной платформы Sites и get_absolute_urlвместо этого. Настройте хотя бы один сайт в администраторе, убедитесь, что в вашей модели есть метод get_absolute_url () , а затем:

>>> from django.contrib.sites.models import Site
>>> domain = Site.objects.get_current().domain
>>> obj = MyModel.objects.get(id=3)
>>> path = obj.get_absolute_url()

>>> url = 'http://{domain}{path}'.format(domain=domain, path=path)
>>> print(url)
'http://example.com/mymodel/objects/3/'

https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls

Автор: shacker Размещён: 25.07.2014 07:39

18 плюса

10788 Репутация автора

Если вы не хотите использовать базу данных, вы можете сделать это с настройкой. Затем используйте контекстный процессор, чтобы добавить его к каждому шаблону:

# settings.py (Django < 1.9)
...
BASE_URL = 'http://example.com'
TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.extra_context',
)
# settings.py (Django >= 1.9)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # Additional
                'myapp.context_processors.extra_context',
            ],
        },
    },
]

# myapp/context_processors.py
from django.conf import settings

def extra_context(request):
    return {'base_url': settings.BASE_URL}

# my_template.html
<p>Base url is {{ base_url }}.</p>
Автор: seddonym Размещён: 19.11.2014 08:40

8 плюса

807 Репутация автора

Чтобы создать полную ссылку на другую страницу из шаблона, вы можете использовать это:

{{ request.META.HTTP_HOST }}{% url 'views.my_view' my_arg %}

request.META.HTTP_HOST дает имя хоста, а url дает относительное имя. Затем шаблонизатор объединяет их в полный URL-адрес.

Автор: Doug Bradshaw Размещён: 06.12.2014 01:46

8 плюса

3716 Репутация автора

Еще один способ. Вы можете использовать build_absolute_uri()в своем view.pyи передать его в шаблон.

view.py

def index(request):
    baseurl = request.build_absolute_uri()
    return render_to_response('your-template.html', { 'baseurl': baseurl })

ваш-template.html

{{ baseurl }}
Автор: Sven Rojek Размещён: 16.01.2015 09:11

5 плюса

61 Репутация автора

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

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

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

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

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

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

{{url_parts.domain}}
Автор: johniak20 Размещён: 06.06.2015 06:24

-2 плюса

1393 Репутация автора

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

Автор: Roge Размещён: 07.07.2015 08:32

-4 плюса

19354 Репутация автора

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

import socket
socket.gethostname()

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

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

Автор: Eduardo Размещён: 18.04.2016 05:02

1 плюс

362 Репутация автора

Я понял:

wsgiref.util.request_uri(request.META)

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

Автор: wonder Размещён: 19.04.2016 06:24

3 плюса

563 Репутация автора

Если вы используете django REST framework, вы можете использовать функцию reverse из 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

Автор: JohnG Размещён: 07.05.2016 08:35

10 плюса

15486 Репутация автора

По вашему мнению, просто сделайте это:

base_url =  "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
Автор: levi Размещён: 10.06.2016 05:53

5 плюса

731 Репутация автора

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

{{ request.scheme }}://{{ request.META.HTTP_HOST }}
Автор: mark Размещён: 19.08.2016 05:59

13 плюса

62935 Репутация автора

django-fullurl

Если вы пытаетесь сделать это в шаблоне Django, я выпустил крошечный пакет PyPI, django-fullurlчтобы вы могли заменить теги urlи staticшаблоны на fullurlи fullstatic, например, так:

{% load fullurl %}

Absolute URL is: {% fullurl "foo:bar" %}

Another absolute URL is: {% fullstatic "kitten.jpg" %}

Надеемся, что эти значки должны автоматически обновляться:

PyPI Трэвис CI

В представлении вы можете, конечно, использовать request.build_absolute_uriвместо этого.

Автор: Flimm Размещён: 02.03.2017 11:59

4 плюса

93 Репутация автора

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

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

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

Автор: Jose Luis Quichimbo Размещён: 28.12.2018 04:56

0 плюса

12405 Репутация автора

Также есть 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()

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

Автор: aris Размещён: 17.01.2019 06:59
Вопросы из категории :
32x32