[django] get_absolute_url und Domain/Host...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Normalerweise gibt get_absolute_url nur eine absolute URL ohne Domain/Host zurück: http://www.djangoproject.com/documentat ... solute-url

Ich brauche aber für einen RSS Feed eine absolute URL mit "http://domain.tld/..."

Nun überlege ich eine zweite Methode, neben get_absolute_url zu implementieren, die halt die Angaben hinzupackt.
Wobei, wie überhaupt Protokoll und Domain zusammen setzten?

Hm... gerade build_absolute_uri gefunden: http://www.djangoproject.com/documentat ... e/#methods
Wie funktioniert das?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hm. Das ist irgendwie dumm, das es an request hängt. Wie soll ich im Model eine Methode implementieren die darauf zugreift???

EDIT: OK, also ich mache das nun so:

Code: Alles auswählen

    ...
    pages = Page.objects.all()
    ...
    for page in pages:
        location = page.get_absolute_url()
        absolute_uri = request.build_absolute_uri(location)
        page.absolute_uri = absolute_uri

    return pages
IMHO wäre es aber schöner, wenn man ein get_absolute_uri() beim Modell implementieren könnte. Kann man aber nicht, weil man im Model keinen Zugriff auf das request Objekt hat.
Naja, so geht es erstmal...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

jens hat geschrieben:Normalerweise gibt get_absolute_url nur eine absolute URL ohne Domain/Host zurück: http://www.djangoproject.com/documentat ... solute-url
Was ist daran absolut? Es ist vielleicht "relativ absolut", weil der Pfad absolut ist - aber es ist keine absolute URL, genau genommen ist es überhaupt keine URL. Auch für einen RFC-konformen Redirect, der eine absolute URL voraussetzt, taugt das entsprechend nicht. Was haben sich die Django-Entwickler bloß dabei gedacht?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Vlt. hilft ja http://www.djangoproject.com/documentat ... -full-urls

Das wäre dann unabhängig von Request (allerdings an die sites app gekoppelt und keine http/https Unterscheidung)...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das ist doch mal ein Tip. Allerdings nutzte ich das Site Framework bisher nicht.

Nun hab ich eine andere Lösung, die auch im Model funktioniert:

Code: Alles auswählen

    def get_absolute_uri(self):
        """
        returned the complete absolute URI (with the domain/host part)
        """
        url = self.get_absolute_url()

        if os.environ.get("HTTPS") == "on":
            protocol = "https"
        else:
            protocol = "http"

        domain = os.environ.get("SERVER_NAME")
        if not domain:
            domain = os.environ.get("HTTP_HOST")
        if not domain:
            # Can't build the complete uri without the domain ;(
            # e.g. running the django development server
            return url

        return "%s://%s%s" % (protocol, domain, url)
Also get_absolute_url liefert wie gehabt die URL ohne domain/host.
Das ganze funktioniert aber nur, wenn SERVER_NAME oder HTTP_HOST gesetzt ist. Das ist z.B. nicht der Fall, wenn man den django develoment Server nutzt. Siehe: http://www.python-forum.de/post-81149.html#81149

Ich weiß nicht ob die Reihenfolge (erst SERVER_NAME und danach HTTP_HOST) die Sinnvollste ist.

Irgendwie ist das alles nicht so schön.

EDIT: Hab mal was in die django-users geschrieben, vielleicht hat da jemand eine bessere Idee: http://groups.google.com/group/django-u ... 12cab5a95b

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten