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 albern ... Ich sollte meine Datenbank nicht abfragen müssen, um die URL zu knacken!
Ich möchte es mit verwenden reverse()
.
Antworten:
Verwenden Sie auf Anfrage die praktische Methode request.build_absolute_uri () , übergeben Sie ihr die relative URL und Sie erhalten eine vollständige.
Standardmäßig wird die absolute URL für
request.get_full_path()
zurückgegeben, Sie können jedoch eine relative URL als erstes Argument übergeben, um sie in eine absolute URL zu konvertieren.quelle
{{ request.build_absolute_uri }}{{ object.get_absolute_url }}
angeben können) können Sie dies einfach tun: - und heyho, vollständige URL.{% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}
weil ich{{ request.build_absolute_uri }}
einen abschließenden Schrägstrich hatte und{{ object.get_absolute_url }}
mit einem Schrägstrich begann, der zu doppelten Schrägstrichen in der URL führte.Wenn Sie es mit verwenden möchten,
reverse()
können Sie dies tun:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
quelle
url_name
view_name
def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Sie können auch
get_current_site
als Teil der Site-App (from django.contrib.sites.models import get_current_site
) verwenden. Es wird ein Anforderungsobjekt verwendet und standardmäßig das Site-Objekt verwendet, mit dem SieSITE_ID
in settings.py konfiguriert haben, wenn die Anforderung lautetNone
. Weitere Informationen zur Verwendung des Site-Frameworks finden Sie in der Dokumentationz.B
Es ist nicht so kompakt / ordentlich wie
request.build_absolute_url()
, aber es kann verwendet werden, wenn Anforderungsobjekte nicht verfügbar sind und Sie eine Standard-Site-URL haben.quelle
django.contrib.sites
in Ihrem habenINSTALLED_APPS
, wird es die DB überhaupt nicht treffen und Informationen basierend auf dem Request-Objekt bereitstellen (siehe get_current_site )build_absolute_uri
sieht aber trotzdem nach der einfacheren und saubereren Lösung aus.Wenn Sie keinen Zugriff
request
darauf erhalten, können Sie dieseget_current_site(request)
in einigen Lösungen hier nicht wie empfohlen verwenden. Sie könnenget_absolute_url
stattdessen eine Kombination aus dem nativen Sites-Framework verwenden. Richten Sie mindestens eine Site im Administrator ein. Stellen Sie sicher, dass Ihr Modell über eine get_absolute_url () -Methode verfügt. Dann:https://docs.djangoproject.com/de/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
quelle
request
aufNone
oder Anrufget_current_site(None)
.Wenn Sie nicht auf die Datenbank zugreifen möchten, können Sie dies mit einer Einstellung tun. Verwenden Sie dann einen Kontextprozessor, um ihn jeder Vorlage hinzuzufügen:
quelle
Tun Sie Ihrer Ansicht nach einfach Folgendes:
quelle
django-fullurl
Wenn Sie versuchen, dies in einer Django-Vorlage zu tun, habe ich ein winziges PyPI-Paket veröffentlicht
django-fullurl
, mit dem Sie Tags durch und wie folgt ersetzenurl
und vorlegen können:static
fullurl
fullstatic
Diese Abzeichen sollten hoffentlich automatisch auf dem neuesten Stand bleiben:
In einer Ansicht können Sie natürlich
request.build_absolute_uri
stattdessen verwenden.quelle
request
Objekt gibt, von dem der Domainname abgerufen werden kann . In diesem Fall sollten Siesites
stattdessen das Framework verwenden, das den Domänennamen aus der Datenbank abruft. Siehedjango-absoluteuri
im Abschnitt "Siehe auch" der README-Datei dieses PyPI-Pakets.So erstellen Sie einen vollständigen Link zu einer anderen Seite aus einer Vorlage:
request.META.HTTP_HOST gibt den Hostnamen und url den relativen Namen an. Die Template-Engine verkettet sie dann zu einer vollständigen URL.
quelle
http
in diesem Zusammenhang) und ein://
Teil der URL, sodass keine vollständige URL bereitgestellt wird .Noch ein anderer Weg. Sie können
build_absolute_uri()
in Ihrem verwendenview.py
und es an die Vorlage übergeben.view.py
your-template.html
quelle
HttpRequest.build_absolute_uri(request)
ist gleichbedeutend mitrequest.build_absolute_uri()
nicht wahr?Untersuchen Sie
Request.META
das eingehende Wörterbuch. Ich denke, es hat den Servernamen und den Serverport.quelle
Versuchen Sie den folgenden Code:
quelle
Das hat bei mir in meiner Vorlage funktioniert:
Ich brauchte die vollständige URL, um sie an eine js-Abruffunktion zu übergeben. Ich hoffe das hilft dir.
quelle
Ich weiß, das ist eine alte Frage. Aber ich denke, die Leute stoßen immer noch oft darauf.
Es gibt einige Bibliotheken, die die Standard-Django-Funktionalität ergänzen. Ich habe ein paar ausprobiert. Ich mag die folgende Bibliothek, wenn absolute URLs umgekehrt referenziert werden:
https://github.com/fusionbox/django-absoluteuri
Eine andere, die mir gefällt, weil Sie einfach eine Domäne, ein Protokoll und einen Pfad zusammenstellen können, ist:
https://github.com/RRMoelker/django-full-url
Mit dieser Bibliothek können Sie einfach schreiben, was Sie in Ihre Vorlage einfügen möchten, z.
quelle
Wenn Sie das Django REST-Framework verwenden, können Sie die Umkehrfunktion von verwenden
rest_framework.reverse
. Dies hat das gleiche Verhalten wiedjango.core.urlresolvers.reverse
, außer dass ein Anforderungsparameter zum Erstellen einer vollständigen URL verwendet wird.Bearbeitet, um die Verfügbarkeit nur im REST-Framework zu erwähnen
quelle
request=request
. Es scheint auch nicht so, als ob die Anfrage hier dokumentiert ist. Docs.djangoproject.com/de/1.9/ref/urlresolvers/#reverseIch habe es bekommen:
Holen Sie sich die vollständige URL mit Schema, Host, Portpfad und Abfrage.
quelle
Als Einstellung steht auch ABSOLUTE_URL_OVERRIDES zur Verfügung
https://docs.djangoproject.com/de/2.1/ref/settings/#absolute-url-overrides
Dies überschreibt jedoch get_absolute_url (), was möglicherweise nicht wünschenswert ist.
Anstatt das Site-Framework nur dafür zu installieren oder einige der anderen hier genannten Dinge zu tun, die auf dem Anforderungsobjekt beruhen, ist es meiner Meinung nach die bessere Lösung, dies in models.py zu platzieren
Definieren Sie BASE_URL in settings.py, importieren Sie es dann 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:
Unterklasse es und jetzt können Sie es überall verwenden.
quelle
Wie in anderen Antworten erwähnt,
request.build_absolute_uri()
ist es perfekt, wenn Sie Zugriff aufrequest
und habensites
Framework ist großartig, solange verschiedene URLs auf verschiedene Datenbanken verweisen.Mein Anwendungsfall war jedoch etwas anders. Mein Staging-Server und der Produktionsserver greifen auf dieselbe Datenbank zu, aber
get_current_site
beide haben den erstensite
in der Datenbank zurückgegeben. Um dies zu beheben, müssen Sie eine Art Umgebungsvariable verwenden. Sie können entweder 1) eine Umgebungsvariable (so etwas wieos.environ.get('SITE_URL', 'localhost:8000')
) oder 2) verschiedeneSITE_ID
s für verschiedene Server UND verschiedene settings.py verwenden .Hoffentlich findet das jemand nützlich!
quelle
Ich bin auf diesen Thread gestoßen, weil ich einen absoluten URI für eine Erfolgsseite erstellen wollte.
request.build_absolute_uri()
gab mir eine URI für meine aktuelle Ansicht, aber um die URI für meine Erfolgsansicht zu erhalten, habe ich Folgendes verwendet ...request.build_absolute_uri (umgekehrt ('success_view_name'))
quelle
request.get_host()
wird Ihnen die Domain geben.quelle
Sie können auch verwenden:
Das funktioniert gut für mich,
Ich bin mir nicht ganz sicher, wie es funktioniert. Ich glaube, dies ist etwas niedriger und gibt Ihren Server-Hostnamen zurück, der sich möglicherweise von dem Hostnamen unterscheidet, den Ihr Benutzer verwendet, um auf Ihre Seite zu gelangen.
quelle
Sie können "request.get_full_path ()" ausprobieren.
quelle