Wie erhalte ich den Domainnamen meiner Website in einer Django-Vorlage?

Lesezeit: 6 Minuten

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.

Benutzeravatar von Carl Meyer
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 der id -Attribut der aktuellen Website in der Sites-App (Sie finden die id im Sites-Admin-Panel). Wenn du anrufst get_currentDjango nimmt Ihre SITE_ID und gibt die zurück Site 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


Benutzeravatar von danbruegge
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

Benutzeravatar von panchicore
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

  • build_absolute_uri ist dokumentiert hier.

    – Philipp Zedler

    10. September 2015 um 19:46 Uhr

Benutzeravatar von Edward Newell
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

  • build_absolute_uri ist dokumentiert hier.

    – Philipp Zedler

    10. September 2015 um 19:46 Uhr

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 SimpleLazyObjectjeder RequestContext werde anrufen get_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 wird Site 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

1435980cookie-checkWie erhalte ich den Domainnamen meiner Website in einer Django-Vorlage?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy