How can I get the full/absolute URL (with domain) in Django?

Django

Django Problem Overview


How can I get the full/absolute URL (e.g. https://example.com/some/path) in Django without the Sites module? That's just silly... I shouldn't need to query my DB to snag the URL!

I want to use it with reverse().

Django Solutions


Solution 1 - Django

Use handy request.build_absolute_uri() method on request, pass it the relative url and it'll give you full one.

By default, the absolute URL for request.get_full_path() is returned, but you can pass it a relative URL as the first argument to convert it to an absolute URL.

>>> request.build_absolute_uri()
'https://example.com/music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri('/bands/?print=true')
'https://example.com/bands/?print=true'

Solution 2 - Django

If you want to use it with reverse() you can do this : request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))

Solution 3 - Django

If you can't get access to request then you can't use get_current_site(request) as recommended in some solutions here. You can use a combination of the native Sites framework and get_absolute_url instead. Set up at least one Site in the admin, make sure your model has a get_absolute_url() method, then:

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

Solution 4 - Django

You can also use get_current_site as part of the sites app (from django.contrib.sites.models import get_current_site). It takes a request object, and defaults to the site object you have configured with SITE_ID in settings.py if request is None. Read more in documentation for using the sites framework

e.g.

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

It isn't as compact/neat as request.build_absolute_url(), but it is usable when request objects are unavailable, and you have a default site url.

Solution 5 - Django

If you don't want to hit the database, you could do it with a setting. Then, use a context processor to add it to every template:

# 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>

Solution 6 - Django

In your view, just do this:

base_url =  "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)

Solution 7 - Django

This worked for me in my template:

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

I needed the full url to pass it to a js fetch function. I hope this help you.

Solution 8 - Django

django-fullurl

If you're trying to do this in a Django template, I've released a tiny PyPI package django-fullurl to let you replace url and static template tags with fullurl and fullstatic, like this:

{% load fullurl %}

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

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

These badges should hopefully stay up-to-date automatically:

PyPI Travis CI

In a view, you can of course use request.build_absolute_uri instead.

Solution 9 - Django

Examine Request.META dictionary that comes in. I think it has server name and server port.

Solution 10 - Django

Yet another way. You could use build_absolute_uri() in your view.py and pass it to the template.

view.py

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

your-template.html

{{ baseurl }}

Solution 11 - Django

Try the following code:

{{ request.scheme }}://{{ request.META.HTTP_HOST }}

Solution 12 - Django

To create a complete link to another page from a template, you can use this:

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

request.META.HTTP_HOST gives the host name, and url gives the relative name. The template engine then concatenates them into a complete url.

Solution 13 - Django

If you're using django REST framework, you can use the reverse function from rest_framework.reverse. This has the same behavior as django.core.urlresolvers.reverse, except that it uses a request parameter to build a full 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,))

Edited to mention availability only in REST framework

Solution 14 - Django

I know this is an old question. But I think people still run into this a lot.

There are a couple of libraries out there that supplement the default Django functionality. I have tried a few. I like the following library when reverse referencing absolute urls:

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

Another one I like because you can easily put together a domain, protocol and path is:

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

This library allows you to simply write what you want in your template, e.g.:

{{url_parts.domain}}

Solution 15 - Django

If anyone is interested in fetching the absolute reverse url with parameters in a template , the cleanest way is to create your own absolute version of the {% url %} template tag by extending and using existing default code.

Here is my code:

from django import template
from django.template.defaulttags import URLNode, url

register = template.Library()

class AbsURLNode(URLNode):
    def __init__(self, view_name, args, kwargs, asvar):
        super().__init__(view_name, args, kwargs, asvar)

    def render(self, context):
        url     = super().render(context)
        request = context['request']

        return request.build_absolute_uri(url)


@register.tag
def abs_url(parser, token):

    urlNode = url(parser, token)
    return AbsURLNode( urlNode.view_name, urlNode.args, urlNode.kwargs, urlNode.asvar  )

Usage in templates:

{% load wherever_your_stored_this_tag_file %}
{% abs_url 'view_name' parameter %}

will render(example):

http://example.com/view_name/parameter/

instead of

/view_name/parameter/

Solution 16 - Django

You can either pass request reverse('view-name', request=request) or enclose reverse() with build_absolute_uri request.build_absolute_uri(reverse('view-name'))

Solution 17 - Django

I got it:

wsgiref.util.request_uri(request.META)

Get the full uri with schema, host, port path and query.

Solution 18 - Django

As mentioned in other answers, request.build_absolute_uri() is perfect if you have access to request, and sites framework is great as long as different URLs point to different databases.

However, my use case was slightly different. My staging server and the production server access the same database, but get_current_site both returned the first site in the database. To resolve this, you have to use some kind of environment variable. You can either use 1) an environment variable (something like os.environ.get('SITE_URL', 'localhost:8000')) or 2) different SITE_IDs for different servers AND different settings.py.

Hopefully someone will find this useful!

Solution 19 - Django

Not for absolute url but I was looking just to get host. If you want to get host in your view.py you can do

def my_view(request):
   host = f"{ request.scheme }://{ request.META.get('HTTP_HOST') }"

Solution 20 - Django

There is also ABSOLUTE_URL_OVERRIDES available as a setting

https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides

But that overrides get_absolute_url(), which may not be desirable.

Instead of installing sites framework just for this or doing some of the other stuff mentioned here that relies on request object, I think the better solution is to place this in models.py

Define BASE_URL in settings.py, then import it into models.py and make an abstract class (or add it to one you're already using) that defines get_truly_absolute_url(). It could be as simple as:

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

Subclass it and now you can use it everywhere.

Solution 21 - Django

I came across this thread because I was looking to build an absolute URI for a success page. request.build_absolute_uri() gave me a URI for my current view but to get the URI for my success view I used the following....

request.build_absolute_uri(reverse('success_view_name'))

Solution 22 - Django

<div class='col-12 col-md-6'>
    <p class='lead'>Login</p>
    {% include 'accounts/snippets/form.html' with form=login_form next_url=request.build_absolute_uri %}
</div>

Here for example am saying load the form and tell the form that the next URL is the current URL which this code rendred from

Solution 23 - Django

While working on a project I came to know to get the full/absolute URL in Django.

If your URL looks like this in the address bar:

https://stackoverflow.com/questions/2345708

And if you want to show the above URL to your template.

  1. {{ request.path }} #Without GET parameters.
  2. {{ request.get_full_path }} #with GET parameters

For the above two codes, this will print in your template will be

questions/2345708

and another way to get a full URL is:

  • {{request.build_absolute_uri}}

this will print in your template will be:

https://stackoverflow.com/questions/2345708

Solution 24 - Django

request.get_host() will give you the domain.

Solution 25 - Django

I use this code :

request.build_absolute_uri('/')[:-1]

response :

https://yourdomain.com

Solution 26 - Django

request.get_host()

Use this for request object for APIView in django

Solution 27 - Django

class WalletViewSet(mixins.ListModelMixin, GenericViewSet):
    serializer_class = WalletSerializers
    pagination_class = CustomPaginationInvestment

    def get_queryset(self):

        ######################################################
        print(self.request.build_absolute_uri())
        #####################################################

        wallet, created = Wallet.objects.get_or_create(owner=self.request.user)
        return Wallet.objects.filter(id=wallet.id)

You get output like this

http://localhost:8000/v1/wallet
HTTP GET /v1/wallet 200 [0.03, 127.0.0.1:41608]

Solution 28 - Django

You can also use:

import socket
socket.gethostname()

This is working fine for me,

I'm not entirely sure how it works. I believe this is a bit more low level and will return your server hostname, which might be different than the hostname used by your user to get to your page.

Solution 29 - Django

You can try "request.get_full_path()"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmpenView Question on Stackoverflow
Solution 1 - DjangoDmitry ShevchenkoView Answer on Stackoverflow
Solution 2 - DjangoébewèView Answer on Stackoverflow
Solution 3 - DjangoshackerView Answer on Stackoverflow
Solution 4 - DjangoDarbView Answer on Stackoverflow
Solution 5 - DjangoseddonymView Answer on Stackoverflow
Solution 6 - DjangoleviView Answer on Stackoverflow
Solution 7 - DjangoJose Luis QuichimboView Answer on Stackoverflow
Solution 8 - DjangoFlimmView Answer on Stackoverflow
Solution 9 - DjangoKugelView Answer on Stackoverflow
Solution 10 - DjangoSven RojekView Answer on Stackoverflow
Solution 11 - DjangomarkView Answer on Stackoverflow
Solution 12 - DjangoDoug BradshawView Answer on Stackoverflow
Solution 13 - DjangoJohnGView Answer on Stackoverflow
Solution 14 - Djangojohniak20View Answer on Stackoverflow
Solution 15 - DjangoPowerAktarView Answer on Stackoverflow
Solution 16 - DjangoFahmi EshaqView Answer on Stackoverflow
Solution 17 - DjangowonderView Answer on Stackoverflow
Solution 18 - DjangoBartlebyView Answer on Stackoverflow
Solution 19 - DjangosultanmyrzaView Answer on Stackoverflow
Solution 20 - DjangoarisView Answer on Stackoverflow
Solution 21 - DjangoSoundtempleView Answer on Stackoverflow
Solution 22 - DjangoFahd MannaaView Answer on Stackoverflow
Solution 23 - Djangosantosh ChauhanView Answer on Stackoverflow
Solution 24 - DjangoRogeView Answer on Stackoverflow
Solution 25 - DjangoRadeshView Answer on Stackoverflow
Solution 26 - DjangoAditya JoardarView Answer on Stackoverflow
Solution 27 - DjangoPawan singh kushwahView Answer on Stackoverflow
Solution 28 - DjangoEduardoView Answer on Stackoverflow
Solution 29 - DjangoMax FerreiraView Answer on Stackoverflow