2017-11-11 5 views
2

Nach der Turbolinks 5-Dokumentation „Nach Redirects“ (https://github.com/turbolinks/turbolinks#following-redirects):Um Turbolinks 5 mit Django zu verwenden, wie kann ich die Einbindung des Headers Turbolinks-Location bei Verwendung von redirect() automatisieren?

Wenn Sie Standort besuchen /one und der Server leitet Sie auf Position /two Sie die Adressleiste des Browsers erwarten, dass die umgeleitet URL anzuzeigen .

Allerdings macht Turbolinks Anfragen XMLHttpRequest, die transparent Umleitungen folgt. Es gibt keine Möglichkeit für Turbolinks, mitzuteilen, ob eine Anfrage zu einer Weiterleitung ohne zusätzliche Kooperation vom Server geführt hat.

und die Lösung hierfür ist:

die Turbolinks-Location Header in Reaktion auf einen Besuch senden, die umgeleitet wurde, und Turbolinks wird der Browser des obersten Geschichte Eintrag mit dem Wert, den Sie bieten ersetzen.

Die Turbolinks Rails-Engine führt diese Optimierung automatisch für Nicht-GET XHR-Anforderungen durch, die mit dem redirect_to-Hilfsprogramm umgeleitet werden.

Ich habe ein großes Interesse Turbolinks auf meinem Django (1,11) Projekt in Verwendung und ich frage mich, ob jemand mich in der richtigen Richtung, wie die bestehenden zu schaffen Punkt könnte ein neue Django umleiten() Funktion oder ändern Einer, der immer den Turbolinks-Location-Header enthält, der für Weiterleitungen benötigt wird, um wie erwartet zu funktionieren. Ich möchte definitiv nicht jedes Mal, wenn ich eine Weiterleitung mache, diesen Header manuell einstellen.

Es gibt einen ähnlichen Eintrag in dem ‚Umleiten Nach Ausfüllen eines Formulars Submission‘ Abschnitt (https://github.com/turbolinks/turbolinks#redirecting-after-a-form-submission) Ich würde schätzen auch jede Hilfe zu verstehen, wie zu implementieren:

Wenn Formulareinreichung führt zu einer Zustandsänderung auf dem Wenn der Server die zwischengespeicherten Seiten betrifft, sollten Sie den Cache von Turbolinks mit Turbolinks.clearCache() löschen.

Die Turbolinks Rails-Engine führt diese Optimierung automatisch für non-GET XHR-Anforderungen durch, die mit dem redirect_to Helfer umleiten.

Ich habe es ein „Django Drop-in turbolinks Implementierung“ Paket auf Github ist aber von turbolinks-classic gegabelt ist und Sourcecode hat erwähnt keine der Turbolinks-Location-Header, so bin ich sicher, dass dies nicht der Fall ist was ich suche.

Antwort

0

Ich entdeckte am Ende, wie man genau das macht, was ich versuchte, indem ich auf einen Blob von Code in diesem Projekt https://github.com/viewflow/django-material/blob/v2/material/middleware.py von einem Reddit-Benutzer verwiesen wurde.

kopierte ich die TurbolinksMiddleware Klasse in meine eigene middleware.py unter meinem Anwendungsverzeichnis und aufgeführt es in meinem settings.py als solche

# MIDDLEWARE CONFIGURATION 
# -------------------------------------------------------------------------- 
MIDDLEWARE = [ 
    . 
    . 
    . 
    'apps.middleware.TurbolinksMiddleware', 
] 

Mit dem regulären Installationsschritt der turbolinks.js in meinem html einschließlich Vorlage schien alles korrekt zu funktionieren. Hier

ist die TurbolinksMiddleware Klasse, falls es nicht auf den obigen Link verfügbar sein sollten:

class TurbolinksMiddleware(object): 
    """ 
    Send the `Turbolinks-Location` header in response to a visit that was redirected, 
    and Turbolinks will replace the browser’s topmost history entry . 
    """ 

    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 
     response = self.get_response(request) 

     is_turbolinks = request.META.get('HTTP_TURBOLINKS_REFERRER') 
     is_response_redirect = response.has_header('Location') 

     if is_turbolinks: 
      if is_response_redirect: 
       location = response['Location'] 
       prev_location = request.session.pop('_turbolinks_redirect_to', None) 
       if prev_location is not None: 
        # relative subsequent redirect 
        if location.startswith('.'): 
         location = prev_location.split('?')[0] + location 
       request.session['_turbolinks_redirect_to'] = location 
      else: 
       if request.session.get('_turbolinks_redirect_to'): 
        location = request.session.pop('_turbolinks_redirect_to') 
        response['Turbolinks-Location'] = location 
     return response 
0

Das von Ihnen erwähnte django-Paket implementiert eine middleware, die für das Hinzufügen der Header zuständig ist. Es scheint, dass für alte Turbolinks die Header unterschiedliche Namen hatten. Sie könnten Ihre eigene Middleware schreiben, um Turbolinks zu unterstützen.

Anstatt Formulare normalerweise einzureichen, reichen Sie sie mit XHR ein.

Sie können dies mit einfachem Django erreichen.Lesen Sie die django CSRF doc - sie erklären im Detail, was notwendig ist.

Verwandte Themen