Ich verwende derzeit die folgende Funktion, um eine verweisende Ansicht zu erhalten:
def get_referer_view(request, default=None):
referer = request.META.get('HTTP_REFERER')
if not referer:
return default
# remove the protocol and split the url at the slashes
referer = re.sub('^https?:\/\/', '', referer).split('/')
if referer[0] != request.META.get('SERVER_NAME'):
return default
# add the slash at the relative path's view and finished
referer = u'/' + u'/'.join(referer[1:])
return referer
Wenn ich das view
als Ergebnis programmatischer Logik umleitete , z.
return HttpResponseRedirect('dashboard')
... gibt es eine Möglichkeit, die verweisende Ansicht ohne Verwendung HTTP_REFERER
abzurufen, damit ich diese Variable in der umgeleiteten verwenden kann view
? Dies wird nicht immer in den Headern des Browsers festgelegt.
Beachten Sie, dass ich POST nicht zum Sammeln der Daten verwenden kann, da die Ansichten programmgesteuert umgeleitet werden.
Vielleicht ist es möglich, einen benutzerdefinierten Header irgendwie zu setzen und abzurufen?
django
django-views
django-urls
alias51
quelle
quelle
?came_from=inbox
. Verknüpft, Facebook, andere scheinen es zu tun, also sollte es in Ordnung sein, zu üben.HttpResponseRedirect
ist nicht wirklich programmatisch - es gibt die tatsächliche http 302-Antwort zurück und zwingt den Browser, eine neue Anfrage an die neue URL der Ansicht zuAntworten:
Verwenden Sie die Middleware-Komponente von Django.
https://docs.djangoproject.com/de/3.0/topics/http/middleware/
So etwas sollte funktionieren:
So können Sie alle benötigten Informationen mit jedem Anforderungs- / Antwortzyklus in Django verknüpfen (Sie können auch benutzerdefinierte Header usw. festlegen).
Im obigen Beispiel
HTTP_REFERER
wird im Anforderungsobjekt als verfügbar seinreferer
.EDIT: Ich denke, Sie befürchten, dass
HTTP_REFERER
nicht immer vom Kunden bevölkert wird; Sie können also HttpRequest.path an jede Anforderung an einen benutzerdefinierten Header binden . Wenn der Pfad nicht ausreicht, können Sie auch die Anforderungsargumente speichern. Das ist alles was ich denke. Dann haben Sie einen benutzerdefinierten Header, der mit dem letzten Pfad gefüllt ist. Wenn dies nicht ausreicht, können Sie den URL-Resolver von Django verwenden .quelle
Da Sie die Seite steuern, auf der die Anfrage gestellt wird, ist dies sicher. Fügen Sie die aktuelle URL zu einem Header hinzu und extrahieren Sie sie in Ihrer Funktion, ähnlich wie folgt: Fügen Sie den Anforderungsheader vor der Umleitung hinzu
also stattdessen:
mach so etwas:
Dies sollte den 302 mit dem benutzerdefinierten Header erzeugen
source-view
, den Sie in der Empfangsansicht extrahieren könnenquelle
Für Interessierte ist hier die Lösung, die ich abgeleitet habe. Der Trick besteht darin, nach der ersten Anforderung zum Speichern des
view_name
oder ein Cookie zu setzenpath
und es dann aufzurufen und im zu speichern,request
bevor die Ansicht gerendert wird.Die Werte werden dann in diesem Zyklus jedes Mal aktualisiert, wenn die Ansicht geändert wird.
quelle