Django Cookies, як їх встановити?


123

У мене є веб-сайт, який показує різний контент на основі місця, яке вибирає відвідувач. наприклад: Користувач вводить 55812 як поштовий індекс. Я знаю, що таке місто та район лат. / Довго. тобто надайте їм вміст, відповідний цій галузі. Моє запитання - як я можу зберігати це у файлі cookie, щоб після повернення їм не потрібно було завжди вводити свій поштовий індекс?

Я бачу це так:

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

Здається, я не можу знайти жодної надійної інформації про налаштування файлу cookie. Будь-яка допомога дуже цінується.


Ті, хто шукає налаштування cookieта rendering a templateразом, бачать цю відповідь.
TheGuardener

Відповіді:


66

ОНОВЛЕННЯ : перевірити відповідь Петра нижче для вбудованого рішення:

Це помічник для встановлення стійкого файлу 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

ОНОВЛЕННЯ : перевірте відповідь Петра нижче для вбудованого рішення:


будь-які проблеми, якщо налаштування.SESSION_COOKIE_DOMAIN не встановлено?
panchicore

1
все одно django встановлює SESSION_COOKIE_DOMAIN за замовчуванням. подумайте над цим налаштуванням, якщо вам потрібно поділитися файлами cookie на декілька субдоменів.
липня

12
-1 з цього приводу django пропонує метод встановлення файлів cookie docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: так, і я нарешті називаю метод джанго у своєму прикладі; це лише ярлик (з 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" було замінено на "в".
сказ

15
Більш пітонічним способом було б викликати запит.COOKIES.get ('cookie_name')
Charlesthk

дозвольте мені задати вам дурне запитання, чи зберігаються ці файли cookie між сесіями інших програм?
Дієго Вініцій

Тут нічого не варто додати, але коли існують рамкові рішення, часто краще використовувати їх, ніж використовувати спеціальні функції помічників для роботи, особливо якщо немає вагомих причин цього не робити. Ці рішення, можливо, спочатку не були доступні, але вони впевнені, так чому б не використовувати їх? Це робить простішим кодом і може обробляти більше випадків, ніж те, що наші користувальницькі помічники думають про обробку, що само по собі є гарним аргументом.
vincent-lg

2
Якщо вам цікаво , як створити об'єкт відповіді Django з об'єкта запиту Django, прочитати: stackoverflow.com/questions/17057536 / ...
critikaster

19

Ви можете встановити печиво вручну, але залежно від випадку використання (і якщо ви хочете додати більше типів постійних даних / сесійних даних у майбутньому), можливо, буде більше сенсу використовувати функцію сеансів Django . Це дозволить вам отримати та встановити змінні внутрішні файли cookie сеансу користувача. Холодна річ у тому, що якщо ви хочете зберігати багато даних, пов’язаних із сеансом користувача, зберігання їх у файлах cookie додасть великої ваги запитам та відповідям HTTP. Під час сеансів файли cookie сеансу - це все, що надсилається вперед і назад (хоча в кінці програми Django зберігаються дані про сеанс, щоб мати на увазі).


4
Гарна думка! Одне зауваження, ви можете зменшити вагу HTTP, розмістивши статичний вміст в окремому домені (не піддомен), щоб файли cookie не надсилалися на ці запити. stackoverflow.com/questions/72394 / ...
John Paulett

@ Коментар ДжонаПалетта застарілий, враховуючи існування рамки сеансів Джанго. Більше не повинно бути необхідності мінімізувати загальне зберігання даних на робочих процесах на основі файлів cookie.
Кріс Конлан

0

Усі, хто зацікавлений у цьому, повинні ознайомитися з документацією сесій Джанго рамки . Він зберігає ідентифікатор сеансу у файлах 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 Session ID.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.