Wie erhalte ich den Domainnamen meiner aktuellen Site aus einer Django-Vorlage? Ich habe versucht, in das Tag und die Filter zu schauen, aber nichts dort.
python
django
django-templates
Jean-François Fabre
quelle
quelle
request.META['HTTP_HOST']
gibt Ihnen die Domain. In einer Vorlage wäre es{{ request.META.HTTP_HOST }}
.Host:
Header fälscht und irgendwo auf einer Seite eine Antwort mit der gefälschten Domain erhält, wie entsteht dann eine Sicherheitslücke? Ich sehe nicht, wie sich das von einem Benutzer unterscheidet, der den generierten HTML-Code nimmt und sich selbst ändert, bevor er ihn seinem eigenen Browser zuführt.Wenn Sie den eigentlichen HTTP-Host-Header möchten, lesen Sie Daniel Rosemans Kommentar zur Antwort von @ Phsiao. Die andere Alternative besteht darin, dass Sie bei Verwendung des Contrib.sites-Frameworks einen kanonischen Domänennamen für eine Site in der Datenbank festlegen können (das Zuordnen der Anforderungsdomäne zu einer Einstellungsdatei mit der richtigen SITE_ID müssen Sie selbst über Ihre durchführen Webserver-Setup). In diesem Fall suchen Sie:
Sie müssten das current_site-Objekt selbst in einen Vorlagenkontext einfügen, wenn Sie es verwenden möchten. Wenn Sie es überall verwenden, können Sie es in einem Vorlagenkontextprozessor verpacken.
quelle
SITE_ID
Einstellung demid
Attribut der aktuellen Site in der Sites-App entspricht (Sie finden sieid
im Sites-Admin-Bereich). Wenn Sie anrufenget_current
, nimmt Django IhreSITE_ID
und gibt dasSite
Objekt mit dieser ID aus der Datenbank zurück.print("get_current_site: ", get_current_site(request)) print("absolute uri: ", request.build_absolute_uri()) print("HTTP_HOST: ", request.META['HTTP_HOST']) get_current_site: localhost:8001 absolute uri: http://localhost:8001/... HTTP_HOST: localhost:8001
Ich habe die
{{ request.get_host }}
Methode entdeckt.quelle
HTTP_X_FORWARDED_HOST
HTTP-Header berücksichtigt wird.request.build_absolute_uri
( docs.djangoproject.com/de/dev/ref/request-response/… )Als Ergänzung zu Carl Meyer können Sie einen Kontextprozessor wie folgt erstellen:
module.context_processors.py
local settings.py
settings.py
Vorlagen, die eine Kontextinstanz zurückgeben. Die URL-Site lautet {{SITE_URL}}.
Sie können Ihre eigene Rutine schreiben, wenn Sie Subdomains oder SSL im Kontextprozessor verarbeiten möchten.
quelle
Die Variation des von mir verwendeten Kontextprozessors ist:
Der
SimpleLazyObject
Wrapper stellt sicher, dass der DB-Aufruf nur dann erfolgt, wenn die Vorlage tatsächlich den verwendetsite
Objekt . Dadurch wird die Abfrage von den Administrationsseiten entfernt. Es speichert auch das Ergebnis zwischen.und in die Einstellungen aufnehmen:
In der Vorlage können Sie
{{ site.domain }}
den aktuellen Domainnamen abrufen.Bearbeiten: Um auch die Protokollumschaltung zu unterstützen, verwenden Sie:
quelle
SimpleLazyObject
, da das Lambda nicht aufgerufen wird, wenn ohnehin nichts auf 'site' zugreift.SimpleLazyObject
,RequestContext
ruft jeder aufget_current_site()
und führt daher eine SQL-Abfrage aus. Der Wrapper stellt sicher, dass die Variable nur ausgewertet wird, wenn sie tatsächlich in der Vorlage verwendet wird.SimpleLazyObject
ist es Umwertung der Funktion zu vermeiden, die benötigt nicht wirklich, da dasSite
Objekt zwischengespeichert wird.from django.contrib.sites.shortcuts import get_current_site
Ich weiß, dass diese Frage alt ist, aber ich bin darauf gestoßen und habe nach einem pythonischen Weg gesucht, um die aktuelle Domain zu erhalten.
quelle
build_absolute_uri
ist hier dokumentiert .Schnell und einfach, aber nicht gut für die Produktion:
(in einer Ansicht)
(in einer Vorlage)
Stellen Sie sicher, dass Sie einen RequestContext verwenden. Dies ist der Fall, wenn Sie Render verwenden .
Vertrauen Sie nicht
request.META['HTTP_HOST']
auf die Produktion: Diese Informationen stammen aus dem Browser. Verwenden Sie stattdessen die Antwort von @ CarlMeyerquelle
request.scheme
. Möglicherweise nur in neueren Versionen von Django verfügbar.request.scheme
wurde in Django 1.7 hinzugefügt.{{ request.get_host }}
sollte vor HTTP-Host-Header-Angriffen schützen, wenn sie zusammen mit dem verwendet werdenALLOWED_HOSTS
Einstellung verwendet werden (hinzugefügt in Django 1.4.4).Beachten Sie, dass
{{ request.META.HTTP_HOST }}
dies nicht den gleichen Schutz bietet. Siehe die Dokumente :In Django 1.8
request
haben sich die Funktionsaufrufe für das Rendern von Vorlagen in Ihrer Vorlage geändert , sodass Sie sie nicht mehr verarbeiten müssenRequestContext
direkt .So rendern Sie eine Vorlage für eine Ansicht mithilfe der Verknüpfungsfunktion
render()
:So rendern Sie eine Vorlage für eine E-Mail. IMO ist der häufigste Fall, in dem Sie den Hostwert möchten:
Hier ist ein Beispiel für das Hinzufügen einer vollständigen URL zu einer E-Mail-Vorlage. request.scheme sollte erhalten
http
oderhttps
abhängig davon, was Sie verwenden:quelle
Ich verwende ein benutzerdefiniertes Vorlagen-Tag. Hinzufügen zu zB
<your_app>/templatetags/site.py
:Verwenden Sie es in einer Vorlage wie dieser:
quelle
get_current
ist eine dokumentierte Methode: docs.djangoproject.com/de/dev/ref/contrib/sites/…'http://%s'
könnte im Falle einerhttps
Verbindung ein Problem sein ; Schema ist in diesem Fall nicht dynamisch.Ähnlich wie bei der Antwort von Benutzer panchicore habe ich dies auf einer sehr einfachen Website getan. Es enthält einige Variablen und stellt sie in der Vorlage zur Verfügung.
SITE_URL
würde einen Wert wieexample.com
SITE_PROTOCOL
halten würde einen Wert wie haltenhttp
oderhttps
SITE_PROTOCOL_URL
würde einen Wert wie haltenhttp://example.com
oderhttps://example.com
SITE_PROTOCOL_RELATIVE_URL
würde einen Wert wie halten//example.com
.module / context_processors.py
settings.py
Dann auf die Vorlagen, nutzen sie als
{{ SITE_URL }}
,{{ SITE_PROTOCOL }}
,{{ SITE_PROTOCOL_URL }}
und{{ SITE_PROTOCOL_RELATIVE_URL }}
quelle
In einer Django-Vorlage können Sie Folgendes tun:
quelle
django.template.context_processors.request
, auch [diese Anleitung half] ( simpleisbetterthancomplex.com/tips/2016/07/20/… )Wenn Sie den Kontextprozessor "request" verwenden und das Django-Sites-Framework verwenden und die Site-Middleware installiert haben (dh Ihre Einstellungen umfassen diese):
... dann haben Sie das
request
Objekt in Vorlagen zur Verfügung und es enthält einen Verweis auf den aktuellenSite
für die Anfrage alsrequest.site
. Sie können die Domain dann in einer Vorlage abrufen mit:quelle
Was ist mit diesem Ansatz? Funktioniert bei mir. Es wird auch bei der Django-Registrierung verwendet .
quelle
localhost
erhalten Sie einhttps
Schema (es wird als sicher angesehen), das nicht funktioniert, wenn Sie eine statische URL haben (nurhttp://127.0.0.1
gültig, nicht gültighttps://127.0.0.1
). Es ist also nicht ideal, wenn es sich noch in der Entwicklung befindet.quelle
Sie können
{{ protocol }}://{{ domain }}
in Ihren Vorlagen verwenden, um Ihren Domain-Namen zu erhalten.quelle