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

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

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

Ответы [ 19 ]

471 голосов
/ 27 февраля 2010

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

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

78 голосов
/ 23 августа 2013

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

55 голосов
/ 11 января 2012

Вы также можете использовать 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-адрес сайта по умолчанию.

47 голосов
/ 25 июля 2014

Если вы не можете получить доступ к 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

16 голосов
/ 19 ноября 2014

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

# 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>
12 голосов
/ 02 марта 2017

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 Travis CI

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

8 голосов
/ 17 января 2015

Еще один способ. Вы можете использовать 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 }}
8 голосов
/ 06 декабря 2014

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

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

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

7 голосов
/ 10 июня 2016

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

base_url =  "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
7 голосов
/ 27 февраля 2010

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

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