it-swarm.com.de

Wie bekomme ich die vollständige/absolute URL (mit Domain) in Django?

Wie kann ich die vollständige/absolute URL (z. B. https://example.com/some/path) in Django ohne das Sites-Modul erhalten? Das ist einfach dumm ... Ich sollte meine Datenbank nicht abfragen müssen, um die URL zu fangen!

Ich möchte es mit reverse() verwenden.

317
mpen

Verwenden Sie auf Anfrage die praktische request.build_absolute_uri () - Methode, übergeben Sie die relative URL und Sie erhalten eine vollständige URL.

Standardmäßig wird die absolute URL für request.get_full_path() zurückgegeben. Sie können jedoch eine relative URL als erstes Argument angeben, um sie in eine absolute URL zu konvertieren.

454

Wenn Sie es mit reverse() verwenden möchten, können Sie Folgendes tun: request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))

73
ébewè

Sie können auch get_current_site als Teil der Sites-App (from Django.contrib.sites.models import get_current_site) verwenden. Es nimmt ein Anforderungsobjekt und verwendet standardmäßig das Site-Objekt, das Sie mit SITE_ID in settings.py konfiguriert haben, wenn request None ist. Lesen Sie mehr in der Dokumentation für mit dem Site-Framework

z.B.

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

Es ist nicht so kompakt/übersichtlich wie request.build_absolute_url(), aber es kann verwendet werden, wenn Anforderungsobjekte nicht verfügbar sind und Sie eine Standard-Site-URL haben.

48
Darb

Wenn Sie keinen Zugriff auf request erhalten, können Sie get_current_site(request) nicht verwenden, wie in einigen Lösungen hier empfohlen. Sie können stattdessen eine Kombination aus dem nativen Sites-Framework und get_absolute_url verwenden. Richten Sie mindestens eine Site im Admin ein. Stellen Sie sicher, dass Ihr Modell eine get_absolute_url () -Methode hat.

>>> 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/de/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls

43
shacker

Wenn Sie nicht auf die Datenbank zugreifen möchten, können Sie dies mit einer Einstellung tun. Verwenden Sie dann einen Kontextprozessor, um ihn zu jeder Vorlage hinzuzufügen:

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

Django-fullurl

Wenn Sie dies in einer Django-Vorlage versuchen, habe ich ein kleines PyPI-Paket Django-fullurl veröffentlicht, mit dem Sie url- und static-Vorlagen-Tags durch fullurl und fullstatic ersetzen können.

{% load fullurl %}

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

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

Diese Abzeichen sollten hoffentlich automatisch auf dem neuesten Stand bleiben:

 PyPI  Travis CI

In einer Ansicht können Sie natürlich stattdessen request.build_absolute_uri verwenden.

10
Flimm

Um einen vollständigen Link zu einer anderen Seite aus einer Vorlage zu erstellen, können Sie Folgendes verwenden:

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

request.META.HTTP_Host gibt den Hostnamen und url den relativen Namen an. Die Template Engine verkettet sie dann zu einer vollständigen URL.

8
Doug Bradshaw

Tun Sie dies aus Ihrer Sicht einfach:

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

Sehen Sie sich das Request.META-Wörterbuch an.

7
Kugel

Noch ein anderer Weg. Sie könnten build_absolute_uri() in Ihrem view.py verwenden und an die Vorlage übergeben.

view.py

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

deine-template.html

{{ baseurl }}
7
Sven Rojek

Versuchen Sie den folgenden Code:

{{ request.scheme }}://{{ request.META.HTTP_Host }}
5
mark

Ich weiß, das ist eine alte Frage. Aber ich glaube, die Leute stoßen immer noch häufig darauf.

Es gibt eine Reihe von Bibliotheken, die die Standardfunktionalität von Django ergänzen. Ich habe einige ausprobiert. Ich mag die folgende Bibliothek, wenn auf absolute URLs umgekehrt verwiesen wird:

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

Eine andere, die ich mag, weil Sie leicht Domäne, Protokoll und Pfad zusammenstellen können:

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

Mit dieser Bibliothek können Sie einfach das, was Sie möchten, in Ihre Vorlage schreiben, z. B .:

{{url_parts.domain}}
5
johniak20

Das funktionierte für mich in meiner Vorlage:

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

Ich brauchte die volle URL, um sie an eine js-Abruffunktion zu übergeben. Ich hoffe, das hilft dir.

2

Wenn Sie das Django-Framework REST verwenden, können Sie die Umkehrfunktion von rest_framework.reverse verwenden. Dies hat dasselbe Verhalten wie Django.core.urlresolvers.reverse, es wird jedoch ein Anforderungsparameter zum Erstellen einer vollständigen URL verwendet.

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

Bearbeitet, um die Verfügbarkeit nur im REST -Rahmen zu erwähnen

2
JohnG

Ich habe es verstanden:

wsgiref.util.request_uri(request.META)

Holen Sie sich den vollständigen URI mit Schema, Host, Portpfad und Abfrage.

1
wonder

Als Einstellung steht auch ABSOLUTE_URL_OVERRIDES zur Verfügung

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

Dies überschreibt aber get_absolute_url (), was möglicherweise nicht wünschenswert ist.

Anstatt das Sites-Framework nur zu diesem Zweck zu installieren oder einige der anderen hier erwähnten Dinge zu erledigen, die auf Anforderungsobjekt angewiesen sind, denke ich, dass die bessere Lösung darin besteht, dies in models.py zu platzieren 

Definieren Sie BASE_URL in settings.py, importieren Sie es anschließend in models.py und erstellen Sie eine abstrakte Klasse (oder fügen Sie sie einer bereits verwendeten hinzu), die get_truly_absolute_url () definiert. Es könnte so einfach sein wie:

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

Subclass es und jetzt können Sie es überall verwenden.

0
aris