2009-10-26 2 views
92

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

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

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

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

ответ

45

Это помощник, чтобы установить постоянные кук:

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 

UPDATE: проверить @Peter ответ ниже для решения встроено: https://stackoverflow.com/a/5575578/174027

+0

любая проблема, если settings.SESSION_COOKIE_DOMAIN не установлен? – panchicore

+1

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

+9

-1 на этом, django поставляется с методом настройки файлов cookie https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponse.set_cookie – klemens

18

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

+3

Хороший вопрос! В одной заметке вы можете уменьшить вес HTTP, разместив статический контент в отдельном домене (не поддомен), чтобы файлы cookie не отправлялись по этим запросам. http://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site/305381#305381 –

199

Django's session framework Использование должна охватывать большинство сценариев, но Джанго также теперь обеспечивают direct cookie manipulation methods по объектам запросов и ответов (так что вы Дон» t нужна вспомогательная функция).

Установка печенье:

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

Получение печенья:

def view(request): 
    if 'cookie_name' in request.COOKIES: 
    value = request.COOKIES['cookie_name'] 
+0

Это был бы более правильный способ сделать это. –

+0

Правильный ответ – PepperoniPizza

+6

Просто обновить - 'has_key' заменен на 'in'. – skaz

Смежные вопросы