Django Cookies, como posso configurá-los?
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?
Defina o cookie persistente com base em sua área.
Quando eles retornarem o cookie de leitura, pegue o CEP.
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.
Aqueles que procuram definir um cookiee rendering a templatejuntos, vêem esta resposta.
— TheGuardener
ATUALIZAÇÃO : verifique a resposta de Peter abaixo para obter uma solução integrada:
Este é um auxiliar para definir um cookie persistente:
def set_cookie(response, key, value, days_expire = 7):
if days_expire is None:
max_age = 365 * 24 * 60 * 60  #one year
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.
response = HttpResponse("hello")
set_cookie(response, 'name', 'jujule')
— jujule
algum problema se settings.SESSION_COOKIE_DOMAIN não estiver definido?
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.
-1 sobre isso, o django vem com um método para definir cookies docs.djangoproject.com/en/dev/ref/request-response/…
— fetzig
@ klemens: yes e eu finalmente chamo o método django no meu exemplo; é apenas um atalho (de 2009) que simplifica o processamento da data.
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)
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:
response.set_cookie('cookie_name', 'cookie_value')
Recuperando um cookie:
value = request.COOKIES.get('cookie_name')
# Cookie is not set
value = request.COOKIES['cookie_name']
Apenas para atualizar - 'has_key' foi substituído por 'in'.
— Skaz #
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
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
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
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/…
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
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 ...
request.session.setdefault('how_many_visits', 0)
request.session['how_many_visits'] += 1
print(request.session['how_many_visits'])
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.