Django Cookies, como posso configurá-los?

123

Eu tenho um site que mostra conteúdo diferente com base no local escolhido pelo visitante. por exemplo: O usuário entra no 55812 como o zip. Eu sei que cidade e área são lat / long. ou seja, e forneça a eles o conteúdo pertinente a essa área. Minha pergunta é como posso armazená-lo em um cookie para que, quando retornarem, não sejam obrigados a sempre inserir seu CEP?

Eu vejo da seguinte maneira:

  1. Defina o cookie persistente com base em sua área.
  2. Quando eles retornarem o cookie de leitura, pegue o CEP.
  3. Retorne o conteúdo com base no CEP no cookie.

Não consigo encontrar nenhuma informação sólida sobre como definir um cookie. Qualquer ajuda é muito apreciada.

Jeffrey
fonte
Aqueles que procuram definir um cookiee rendering a templatejuntos, vêem esta resposta.
TheGuardener

Respostas:

66

ATUALIZAÇÃO : verifique a resposta de Peter abaixo para obter uma solução integrada:

Este é um auxiliar para definir um cookie persistente:

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)

Use o código a seguir antes de enviar uma resposta.

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

ATUALIZAÇÃO : verifique a resposta de Peter abaixo para obter uma solução integrada:

jujule
fonte
algum problema se settings.SESSION_COOKIE_DOMAIN não estiver definido?
precisa saber é o seguinte
1
de qualquer maneira, o próprio django define um SESSION_COOKIE_DOMAIN padrão. pense nessa configuração se precisar compartilhar cookies entre vários subdomínios.
jujule
12
-1 sobre isso, o django vem com um método para definir cookies docs.djangoproject.com/en/dev/ref/request-response/…
fetzig
2
@ klemens: yes e eu finalmente chamo o método django no meu exemplo; é apenas um atalho (de 2009) que simplifica o processamento da data.
jujule
5
eu não ligo, mas, fyi: a função auxiliar inútil já era inútil em 2009. docs.djangoproject.com/en/1.0/ref/request-response/… (o django 1.0 foi lançado em setembro de 2008, tanto quanto eu sei)
fetzig
259

O uso da estrutura de sessões do Django deve cobrir a maioria dos cenários, mas o Django agora também fornece métodos de manipulação direta de cookies nos objetos de solicitação e resposta (para que você não precise de uma função auxiliar).

Configurando um cookie:

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

Recuperando um 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
Peter
fonte
10
Apenas para atualizar - 'has_key' foi substituído por 'in'.
Skaz #
15
Uma maneira mais Python seria chamar request.COOKIES.get ( 'cookie_name')
Charlesthk
deixe-me fazer uma pergunta boba, esses cookies persistem entre outras sessões de uso?
Diego Vinícius
Nada de valor a acrescentar aqui, mas quando existem soluções de estrutura, geralmente é melhor usá-las em vez de usar funções auxiliares personalizadas para o trabalho, especialmente se não houver um bom motivo para não fazê-lo. Essas soluções podem não estar disponíveis no início, mas com certeza estão, então por que não usá-las? Isso cria um código mais simples e pode lidar com mais casos do que o que nossos auxiliares personalizados pensariam em manipular, o que, por si só, é um bom argumento na minha opinião.
vincent-lg
2
Se você está se perguntando como criar um objeto de resposta do Django a partir de um objeto de solicitação do Django, leia o seguinte: stackoverflow.com/questions/17057536/…
critikaster
19

Você pode definir manualmente o cookie, mas dependendo do seu caso de uso (e se desejar adicionar mais tipos de dados persistentes / de sessão no futuro), pode fazer mais sentido usar o recurso de sessões do Django . Isso permitirá que você obtenha e defina variáveis ​​vinculadas internamente ao cookie de sessão do usuário. O interessante é que, se você deseja armazenar muitos dados vinculados à sessão de um usuário, armazenar tudo em cookies adicionará muito peso às solicitações e respostas HTTP. Com as sessões, o cookie da sessão é tudo o que é enviado para frente e para trás (embora exista uma sobrecarga no final do Django de armazenar os dados da sessão para ter em mente).

Ben Regenspan
fonte
4
Bom ponto! Uma observação, você pode reduzir o peso do HTTP hospedando conteúdo estático em um domínio separado (não no subdomínio), para que os cookies não sejam enviados nessas solicitações. stackoverflow.com/questions/72394/…
John Paulett
O comentário do @ JohnPaulett está desatualizado, dada a existência da estrutura do Django Sessions. Não há mais necessidade de minimizar o armazenamento total de dados em fluxos de trabalho baseados em cookies.
Chris Conlan
0

Qualquer pessoa interessada em fazer isso deve ler a documentação das sessões do Django . Ele armazena um ID de sessão nos cookies do usuário, mas mapeia todos os dados semelhantes aos cookies para o seu banco de dados. Isso é uma melhoria no fluxo de trabalho típico baseado em cookies para solicitações HTTP.

Aqui está um exemplo com uma visão do 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', {})

Se você continuar visitando a página várias vezes, verá o valor aumentar de 1 até limpar seus cookies, visitar um novo navegador, tornar-se anônimo ou fazer qualquer outra coisa que contornar o cookie de identificação de sessão do Django.

Chris Conlan
fonte