Wie erhalte ich den Domänennamen meiner aktuellen Website aus einer Django-Vorlage? Ich habe versucht, im Tag und in den Filtern zu suchen, aber dort ist nichts.
Wie erhalte ich den Domainnamen meiner Website in einer Django-Vorlage?
Karl Meier
Wenn Sie den eigentlichen HTTP-Host-Header möchten, lesen Sie den Kommentar von Daniel Roseman zur Antwort von @Phsiao. Die andere Alternative ist, wenn Sie die verwenden contrib.sites-Framework, können Sie einen kanonischen Domänennamen für eine Site in der Datenbank festlegen (das Zuordnen der Anforderungsdomäne zu einer Einstellungsdatei mit der richtigen SITE_ID ist etwas, das Sie selbst über Ihr Webserver-Setup tun müssen). In diesem Fall suchen Sie:
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
current_site.domain
Sie müssten das Objekt current_site selbst in einen Vorlagenkontext stellen, wenn Sie es verwenden möchten. Wenn Sie es überall verwenden, können Sie es in einen Vorlagenkontextprozessor packen.
-
Zur Verdeutlichung für jemanden, der die gleichen Probleme hat wie ich: Überprüfen Sie, ob Ihre
SITE_ID
Einstellung ist gleich derid
-Attribut der aktuellen Website in der Sites-App (Sie finden dieid
im Sites-Admin-Panel). Wenn du anrufstget_current
Django nimmt IhreSITE_ID
und gibt die zurückSite
Objekt mit dieser ID aus der Datenbank.– Dennis Golomazov
1. Juli 2013 um 9:12 Uhr
-
Keines davon funktioniert bei mir.
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
– Benutzer10469346
11. Mai 2020 um 13:43 Uhr
danbrügge
Ich habe die entdeckt {{ request.get_host }}
Methode.
-
Bitte beachten Sie, dass diese Antwort die gleichen Probleme wie der Ansatz von Daniel Roseman hat (sie kann gefälscht werden), aber sie ist sicherlich vollständiger, wenn der Host über einen HTTP-Proxy oder Load Balancer erreicht wird, da dies berücksichtigt wird
HTTP_X_FORWARDED_HOST
HTTP-Header.– Furine
8. Januar 2014 um 19:02 Uhr
-
Verwendung: “//{{ request.get_host }}/anything/else/you/want”… Achten Sie darauf, Ihre ALLOWED_HOSTS-Einstellung auszufüllen (siehe docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts).
– Seth
19. Februar 2014 um 12:59 Uhr
-
@Seth besser zu verwenden
request.build_absolute_uri
(docs.djangoproject.com/en/dev/ref/request-response/…)– HerrKsn
29. November 2017 um 12:29 Uhr
-
Ich muss den Hostnamen für meine Anwendung dynamisch erstellen, da ich keine Tenary-Anweisung verwenden musste, um zwischen Zeichenfolgen für die lokale Entwicklungsversion und die Produktion zu wechseln, die beide zum Testen eines Zahlungs-Gateway-Integrationssystems benötigt wurden. ) in der Ansicht und das Hinzufügen von add forward slashed zur zurückgegebenen Zeichenfolge hat die Arbeit erledigt
– Brian Obot
14. Juni um 14:04 Uhr
Ich denke, Sie möchten Zugriff auf den Anforderungskontext haben, siehe RequestContext.
-
request.META['HTTP_HOST']
gibt Ihnen die Domäne. In einer Vorlage wäre es{{ request.META.HTTP_HOST }}
.– Daniel Rosemann
20. September 2009 um 14:42 Uhr
-
Seien Sie vorsichtig bei der Verwendung von Anforderungsmetadaten. Es kommt von einem Browser und kann gefälscht werden. Im Allgemeinen sollten Sie sich wahrscheinlich an das halten, was unten von @CarlMeyer vorgeschlagen wird.
– Josch
3. Juli 2012 um 15:30 Uhr
-
Für meine Zwecke hat dies keine Sicherheitslücke.
– Paul Tucher
15. März 2013 um 18:58 Uhr
-
Ich denke, seit Django 1.5 mit der Einstellung für zulässige Hosts ist es sicher zu verwenden. docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
– Daniel Backmann
23. September 2013 um 15:13 Uhr
-
Kann jemand näher erläutern, was die “Sicherheitslücke” ist? Wenn der Benutzer die
Host:
Header und bekommt eine Antwort mit der gefälschten Domäne irgendwo auf einer Seite zurück, wie entsteht dadurch eine Sicherheitslücke? Ich sehe nicht, wie sich das von einem Benutzer unterscheidet, der den generierten HTML-Code nimmt und selbst modifiziert, bevor er ihn in seinen eigenen Browser einspeist.– Benutzer193130
16. Mai 2016 um 21:45 Uhr
Panchicore
Als Ergänzung zu Carl Meyer können Sie einen Kontextprozessor wie diesen erstellen:
module.context_processors.py
from django.conf import settings
def site(request):
return {'SITE_URL': settings.SITE_URL}
lokale Einstellungen.py
SITE_URL = 'http://google.com' # this will reduce the Sites framework db call.
settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
...
"module.context_processors.site",
....
)
Vorlagen, die Kontextinstanz zurückgeben, ist die URL-Site {{ SITE_URL }}
Sie können Ihre eigene Routine schreiben, wenn Sie Subdomains oder SSL im Kontextprozessor verarbeiten möchten.
Ich weiß, dass diese Frage alt ist, aber ich bin darauf gestoßen, als ich nach einem pythonischen Weg suchte, um die aktuelle Domain zu erhalten.
def myview(request):
domain = request.build_absolute_uri("https://stackoverflow.com/")[:-1]
# that will build the complete domain: http://foobar.com
Eduard Newell
Schnell und einfach, aber nicht gut für die Produktion:
(in einer Ansicht)
request.scheme # http or https
request.META['HTTP_HOST'] # example.com
request.path # /some/content/1/
(in einer Vorlage)
{{ request.scheme }} :// {{ request.META.HTTP_HOST }} {{ request.path }}
Verwenden Sie unbedingt a Anforderungskontextwas der Fall ist, wenn Sie verwenden machen.
Vertraue nicht request.META['HTTP_HOST']
in der Produktion: Diese Informationen stammen vom Browser. Verwenden Sie stattdessen die Antwort von @CarlMeyer
Die Variation des Kontextprozessors, den ich verwende, ist:
from django.contrib.sites.shortcuts import get_current_site
from django.utils.functional import SimpleLazyObject
def site(request):
return {
'site': SimpleLazyObject(lambda: get_current_site(request)),
}
Das SimpleLazyObject
Wrapper stellt sicher, dass der DB-Aufruf nur dann erfolgt, wenn die Vorlage die tatsächlich verwendet site
Objekt. Dadurch wird die Abfrage von den Admin-Seiten entfernt. Es speichert auch das Ergebnis.
und nimm es in die Einstellungen auf:
TEMPLATE_CONTEXT_PROCESSORS = (
...
"module.context_processors.site",
....
)
In der Vorlage können Sie verwenden {{ site.domain }}
um den aktuellen Domainnamen zu erhalten.
bearbeiten: Um auch die Protokollumschaltung zu unterstützen, verwenden Sie:
def site(request):
site = SimpleLazyObject(lambda: get_current_site(request))
protocol="https" if request.is_secure() else 'http'
return {
'site': site,
'site_root': SimpleLazyObject(lambda: "{0}://{1}".format(protocol, site.domain)),
}
-
Sie müssen nicht verwenden
SimpleLazyObject
hier, weil das Lambda sowieso nicht aufgerufen wird, wenn nichts auf ‘site’ zugreift.– Monochrom
7. August 2014 um 22:26 Uhr
-
Wenn Sie die entfernen
SimpleLazyObject
jederRequestContext
werde anrufenget_current_site()
, und führen Sie daher eine SQL-Abfrage aus. Der Wrapper stellt sicher, dass die Variable nur ausgewertet wird, wenn sie tatsächlich in der Vorlage verwendet wird.– vdboor
14. August 2014 um 9:51 Uhr
-
Da es sich um eine Funktion handelt, wird die Hostzeichenfolge nicht verarbeitet, es sei denn, sie wird ohnehin verwendet. Sie können also einfach ‚site_root‘ eine Funktion zuweisen und benötigen kein SimpleLazyObject. Django ruft die Funktion auf, wenn sie verwendet wird. Die notwendige Funktion haben Sie hier sowieso schon mit einem Lambda erstellt.
– Monochrom
20. August 2014 um 17:42 Uhr
-
Ah ja, nur ein Lambda würde funktionieren. Das
SimpleLazyObject
ist da, um eine Neubewertung der Funktion zu vermeiden, die seit dem nicht wirklich benötigt wirdSite
Objekt wird zwischengespeichert.– vdboor
27. August 2014 um 9:25 Uhr
-
Der Import ist jetzt
from django.contrib.sites.shortcuts import get_current_site
– Hraban
14. Juni 2016 um 5:15 Uhr