Django-Cookies, wie kann ich sie setzen?

123

Ich habe eine Website, auf der je nach dem vom Besucher ausgewählten Ort unterschiedliche Inhalte angezeigt werden. Beispiel: Der Benutzer gibt 55812 als Reißverschluss ein. Ich weiß, welche Stadt und welches Gebiet lat / lang ist. das heißt und geben Sie ihnen ihren für diesen Bereich relevanten Inhalt. Meine Frage ist, wie ich dies in einem Cookie speichern kann, damit sie bei ihrer Rückkehr nicht immer ihre Postleitzahl eingeben müssen.

Ich sehe es wie folgt:

  1. Setzen Sie dauerhafte Cookies basierend auf ihrem Bereich.
  2. Wenn sie den gelesenen Cookie zurückgeben, holen Sie sich die Postleitzahl.
  3. Geben Sie Inhalte basierend auf der Postleitzahl in ihrem Cookie zurück.

Ich kann anscheinend keine soliden Informationen zum Setzen eines Cookies finden. Jede Hilfe wird sehr geschätzt.

Jeffrey
quelle
Diejenigen, die ein cookieund rendering a templatezusammen setzen möchten, sehen diese Antwort.
TheGuardener

Antworten:

66

UPDATE : Überprüfen Sie Peters Antwort unten auf eine integrierte Lösung:

Dies ist ein Helfer zum Setzen eines dauerhaften Cookies:

import datetime

def set_cookie(response, key, value, days_expire = 7):
  if days_expire is None:
    max_age = 365 * 24 * 60 * 60  #one year
  else:
    max_age = days_expire * 24 * 60 * 60 
  expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
  response.set_cookie(key, value, max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, secure=settings.SESSION_COOKIE_SECURE or None)

Verwenden Sie den folgenden Code, bevor Sie eine Antwort senden.

def view(request):
  response = HttpResponse("hello")
  set_cookie(response, 'name', 'jujule')
  return response

UPDATE : Überprüfen Sie Peters Antwort unten auf eine integrierte Lösung:

Jujule
quelle
Gibt es ein Problem, wenn settings.SESSION_COOKIE_DOMAIN nicht festgelegt ist?
Panchicore
1
Trotzdem setzt django selbst einen Standardwert für SESSION_COOKIE_DOMAIN. Denken Sie an diese Einstellung, wenn Sie Cookies für mehrere Subdomains freigeben müssen.
Jujule
12
-1 auf diesem, kommt Django mit einer Methode, um Cookies zu setzen docs.djangoproject.com/en/dev/ref/request-response/…
fetzig
2
@klemens: Ja und ich rufe endlich die Django-Methode in meinem Beispiel auf. Es ist nur eine Verknüpfung (ab 2009), die die Datumsverarbeitung vereinfacht.
Jujule
5
Es ist mir egal, aber zu Ihrer Information : Nutzlose Hilfsfunktionen waren bereits 2009 nutzlos. docs.djangoproject.com/de/1.0/ref/request-response/… (django 1.0 wurde, soweit ich weiß, im September 2008 veröffentlicht)
Fetzig
259

Die Verwendung des Sitzungsframeworks von Django sollte die meisten Szenarien abdecken, aber Django bietet jetzt auch direkte Cookie-Manipulationsmethoden für die Anforderungs- und Antwortobjekte (sodass Sie keine Hilfsfunktion benötigen).

Cookie setzen:

def view(request):
  response = HttpResponse('blah')
  response.set_cookie('cookie_name', 'cookie_value')

Cookie abrufen:

def view(request):
  value = request.COOKIES.get('cookie_name')
  if value is None:
    # Cookie is not set

  # OR

  try:
    value = request.COOKIES['cookie_name']
  except KeyError:
    # Cookie is not set
Peter
quelle
10
Nur zum Aktualisieren - 'has_key' wurde durch 'in' ersetzt.
Skaz
15
Ein pythonischerer Weg wäre, request.COOKIES.get ('cookie_name')
Charlesthk
Lassen Sie mich Ihnen eine dumme Frage stellen, diese Cookies bleiben zwischen anderen Verwendungssitzungen bestehen?
Diego Vinícius
Hier gibt es nichts Wertvolles hinzuzufügen, aber wenn Framework-Lösungen vorhanden sind, ist es oft besser, sie zu verwenden, als benutzerdefinierte Hilfsfunktionen für den Job zu verwenden, insbesondere wenn es keinen guten Grund gibt, dies nicht zu tun. Diese Lösungen waren möglicherweise zunächst nicht verfügbar, sind es aber sicher. Warum also nicht? Dies führt zu einem einfacheren Code und behandelt möglicherweise mehr Fälle als unsere benutzerdefinierten Helfer denken würden, was meiner Meinung nach an sich ein gutes Argument ist.
Vincent-lg
2
Wenn Sie sich fragen, wie Sie ein Django- Antwortobjekt
Folgendes
19

Sie können das Cookie manuell setzen, aber je nach Anwendungsfall (und wenn Sie in Zukunft weitere Arten von persistenten / Sitzungsdaten hinzufügen möchten) ist es möglicherweise sinnvoller, die Sitzungsfunktion von Django zu verwenden . Auf diese Weise können Sie Variablen abrufen und festlegen , die intern mit dem Sitzungscookie des Benutzers verknüpft sind. Das Coole daran ist, dass, wenn Sie viele Daten speichern möchten, die an die Sitzung eines Benutzers gebunden sind, das Speichern in Cookies HTTP-Anfragen und -Antworten viel Gewicht verleiht. Bei Sitzungen ist das Sitzungscookie alles, was hin und her gesendet wird (obwohl Djangos Ende des Speicherns der Sitzungsdaten zu beachten ist).

Ben Regenspan
quelle
4
Guter Punkt! Ein Hinweis: Sie können das HTTP-Gewicht reduzieren, indem Sie statischen Inhalt in einer separaten Domain (keine Subdomain) hosten, sodass die Cookies bei diesen Anforderungen nicht gesendet werden. stackoverflow.com/questions/72394/…
John Paulett
@ JohnPauletts Kommentar ist angesichts der Existenz des Django Sessions-Frameworks veraltet. Es sollte nicht länger erforderlich sein, die gesamte Datenspeicherung in Cookie-basierten Workflows zu minimieren.
Chris Conlan
0

Jeder, der daran interessiert ist, sollte die Dokumentation des Django Sessions Frameworks lesen . Es speichert eine Sitzungs-ID in den Cookies des Benutzers, ordnet jedoch alle Cookies-ähnlichen Daten Ihrer Datenbank zu. Dies ist eine Verbesserung gegenüber dem typischen Cookie-basierten Workflow für HTTP-Anforderungen.

Hier ist ein Beispiel mit einer Django-Ansicht ...

def homepage(request):

    request.session.setdefault('how_many_visits', 0)
    request.session['how_many_visits'] += 1

    print(request.session['how_many_visits'])

    return render(request, 'home.html', {})

Wenn Sie die Seite immer wieder besuchen, wird der Wert von 1 auf 1 erhöht, bis Sie Ihre Cookies löschen, einen neuen Browser aufrufen, inkognito gehen oder etwas anderes tun, das Djangos Sitzungs-ID-Cookie umgeht.

Chris Conlan
quelle