Файлы cookie Django, как их установить?


123

У меня есть веб-сайт, на котором отображается различное содержание в зависимости от местоположения, которое выбирает посетитель. например: Пользователь вводит 55812 как zip. Я знаю, какой город и район шир / долг. то есть и дать им их содержание, относящееся к этой области. У меня вопрос, как я могу сохранить это в файле cookie, чтобы по возвращении им не требовалось всегда вводить свой почтовый индекс?

Я вижу это следующим образом:

  1. Установите постоянные файлы cookie в зависимости от их области.
  2. Когда они вернут прочитанный cookie, возьмите почтовый индекс.
  3. Возвращать контент на основе почтового индекса в их cookie.

Кажется, я не могу найти какой-либо достоверной информации о настройке cookie. Любая помощь приветствуется.


Тем, кто ищет постановку cookieи rendering a templateвместе, смотрите этот ответ.
TheGuardener

Ответы:


67

ОБНОВЛЕНИЕ : проверьте ответ Питера ниже для встроенного решения:

Это помощник для установки постоянного файла cookie:

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)

Используйте следующий код перед отправкой ответа.

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

ОБНОВЛЕНИЕ : проверьте ответ Питера ниже для встроенного решения:


какие-либо проблемы, если settings.SESSION_COOKIE_DOMAIN не установлен?
panchicore

1
в любом случае сам django устанавливает SESSION_COOKIE_DOMAIN по умолчанию. подумайте об этом параметре, если вам нужно использовать файлы cookie для нескольких поддоменов.
jujule

12
-1 в этом случае django имеет метод установки файлов cookie docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: да, и я наконец вызываю в своем примере метод django; это просто ярлык (с 2009 года), который упрощает обработку даты.
jujule

5
мне все равно, но, к вашему сведению: бесполезная вспомогательная функция уже была бесполезной в 2009 году. docs.djangoproject.com/en/1.0/ref/request-response/… (насколько мне известно, django 1.0 был выпущен в сентябре 2008 года)
fetzig

259

Использование структуры сеанса Django должно охватывать большинство сценариев, но Django теперь также предоставляет методы прямого управления файлами cookie для объектов запроса и ответа (так что вам не нужна вспомогательная функция).

Установка cookie:

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

Получение cookie:

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

10
Просто для обновления - has_key заменено на in.
сказ

15
Более питонический способ - вызвать request.COOKIES.get ('cookie_name')
Charlesthk

позвольте мне задать вам глупый вопрос, эти файлы cookie сохраняются между другими сеансами использования?
Диего Винисиус

Здесь нечего добавить, но когда существуют каркасные решения, часто лучше использовать их, чем использовать специальные вспомогательные функции для работы, особенно если нет веской причины не делать этого. Возможно, эти решения сначала не были доступны, но они точно есть, так почему бы не использовать их? Это упрощает код и может обрабатывать больше случаев, чем то, что думали бы наши пользовательские помощники, что само по себе является хорошим аргументом, на мой взгляд.
vincent-lg

2
Если вам интересно, как создать объект ответа Django из объекта запроса Django, прочтите это: stackoverflow.com/questions/17057536/…
эксперт-критик

19

Вы можете вручную установить файл cookie, но в зависимости от вашего варианта использования (и если вы, возможно, захотите добавить больше типов постоянных данных / данных сеанса в будущем), возможно, имеет смысл использовать функцию сеансов Django . Это позволит вам получать и устанавливать переменные, связанные внутренне с файлом cookie сеанса пользователя. Интересно то, что если вы хотите хранить много данных, привязанных к сеансу пользователя, сохранение их в файлах cookie значительно повысит вес HTTP-запросов и ответов. В сеансах cookie сеанса - это все, что отправляется туда и обратно (хотя на стороне Django есть накладные расходы, связанные с хранением данных сеанса).


4
Хорошая точка зрения! Одно замечание: вы можете уменьшить вес HTTP, разместив статический контент в отдельном домене (не субдомене), чтобы файлы cookie не отправлялись по этим запросам. stackoverflow.com/questions/72394/…
Джон Полетт

Комментарий @ JohnPaulett устарел, учитывая существование фреймворка Django Sessions. Больше не должно быть необходимости минимизировать общий объем хранения данных в рабочих процессах на основе файлов cookie.
Крис Конлан

0

Всем, кто заинтересован в этом, следует прочитать документацию сеансов Django. . Он хранит идентификатор сеанса в файлах cookie пользователя, но сопоставляет все данные, подобные файлам cookie, в вашей базе данных. Это улучшение типичного рабочего процесса на основе файлов cookie для HTTP-запросов.

Вот пример с представлением Django ...

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', {})

Если вы продолжаете посещать страницу снова и снова, вы увидите, что значение начинает увеличиваться с 1 до тех пор, пока вы не очистите свои файлы cookie, не зайдете в новый браузер, не перейдете в режим инкогнито или не сделаете что-нибудь еще, что позволяет избежать cookie-файла идентификатора сеанса Django.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.