장고 쿠키, 어떻게 설정할 수 있습니까?


123

방문자가 선택한 위치에 따라 다른 콘텐츠를 보여주는 웹 사이트가 있습니다. 예 : 사용자가 zip으로 55812를 입력합니다. 나는 어떤 도시와 지역의 위도 / 경도를 알고 있습니다. 즉, 해당 영역과 관련된 콘텐츠를 제공합니다. 제 질문은 쿠키에 이것을 저장하여 그들이 돌아올 때 항상 우편 번호를 입력 할 필요가 없도록하는 것입니다.

다음과 같이 봅니다.

  1. 영역에 따라 영구 쿠키를 설정합니다.
  2. 쿠키 읽기를 반환하면 우편 번호를 가져옵니다.
  3. 쿠키의 우편 번호를 기반으로 콘텐츠를 반환합니다.

쿠키 설정에 대한 확실한 정보를 찾을 수없는 것 같습니다. 어떤 도움이라도 대단히 감사합니다.


a cookierendering a template함께 설정하려는 사람들 은 답변을 참조하십시오 .
TheGuardener

답변:


66

업데이트 : 내장 솔루션에 대한 Peter의 답변을 아래에서 확인하십시오 .

영구 쿠키를 설정하는 도우미입니다.

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

업데이트 : 내장 솔루션에 대한 Peter의 답변을 아래에서 확인하십시오 .


settings.SESSION_COOKIE_DOMAIN이 설정되지 않은 경우 문제가 있습니까?
panchicore

1
어쨌든 django 자체는 기본 SESSION_COOKIE_DOMAIN을 설정합니다. 여러 하위 도메인에서 쿠키를 공유해야하는 경우이 설정을 고려하십시오.
jujule

12
-1, django는 쿠키를 설정하는 방법을 제공합니다. docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens : 예 그리고 나는 마침내 내 예제에서 django 메소드를 호출합니다. 날짜 처리를 단순화하는 바로 가기 (2009 년부터)입니다.
jujule

5
나는 상관하지 않지만, fyi : 쓸모없는 도우미 기능은 이미 2009 년에 쓸모가 없었습니다. docs.djangoproject.com/en/1.0/ref/request-response/… (django 1.0은 내가 아는 한 2008 년 9 월에 출시되었습니다)
fetzig

259

Django의 세션 프레임 워크를 사용하면 대부분의 시나리오를 다룰 수 있지만 Django는 이제 요청 및 응답 개체에 대한 직접 쿠키 조작 방법 도 제공 합니다 (따라서 도우미 함수가 필요하지 않음).

쿠키 설정 :

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

쿠키 검색 :

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'으로 대체되었습니다.
skaz

15
더 파이썬 방법은 request.COOKIES.get ( 'cookie_name')를 호출하는 것입니다
Charlesthk

어리석은 질문을하겠습니다.이 쿠키는 다른 사용 세션간에 지속됩니까?
Diego Vinícius

여기에 추가 할 가치가 없지만 프레임 워크 솔루션이있는 경우 작업에 사용자 지정 도우미 함수를 사용하는 것보다 사용하는 것이 더 낫습니다. 특히 그렇게하지 않을 이유가없는 경우에는 더욱 그렇습니다. 이러한 솔루션은 처음에는 사용 가능하지 않았을 수 있지만 확실합니다. 사용하지 않는 이유는 무엇입니까? 그것은 더 간단한 코드를 만들고 우리의 커스텀 헬퍼가 처리에 대해 생각하는 것보다 더 많은 경우를 처리 할 수 ​​있습니다. 이것은 그 자체로 제 생각에 좋은 주장입니다.
vincent-lg

2
Django 요청 개체에서 Django 응답 개체를 만드는 방법이 궁금하다면 다음을 읽어보십시오. stackoverflow.com/questions/17057536/…
critikaster 19

19

쿠키를 수동으로 설정할 수 있지만 사용 사례에 따라 (그리고 나중에 더 많은 유형의 영구 / 세션 데이터를 추가하려는 경우) Django의 세션 기능 을 사용하는 것이 더 합리적 일 수 있습니다 . 이를 통해 사용자의 세션 쿠키에 내부적으로 연결된 변수 를 가져오고 설정할 수 있습니다 . 이것에 대한 멋진 점은 사용자 세션에 연결된 많은 데이터를 저장하려는 경우 모든 데이터를 쿠키에 저장하면 HTTP 요청 및 응답에 많은 가중치가 추가된다는 것입니다. 세션에서 세션 쿠키는 앞뒤로 전송되는 모든 것입니다 (Django가 세션 데이터를 저장하는 데는 오버 헤드가 있음을 염두에 두어야합니다).


4
좋은 지적! 참고로, 별도의 도메인 (하위 도메인이 아님)에서 정적 콘텐츠를 호스팅하여 HTTP 가중치를 줄여 쿠키가 해당 요청에 전송되지 않도록 할 수 있습니다. stackoverflow.com/questions/72394/…
John Paulett 2009-10-28

@JohnPaulett의 의견은 Django Sessions 프레임 워크의 존재를 고려할 때 구식입니다. 더 이상 쿠키 기반 워크 플로에서 전체 데이터 저장을 최소화 할 필요가 없습니다.
Chris Conlan

0

이 작업에 관심이있는 사람은 Django Sessions 프레임 워크 의 문서를 읽어야합니다 . 사용자의 쿠키에 세션 ID를 저장하지만 모든 쿠키와 유사한 데이터를 데이터베이스에 매핑합니다. 이는 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', {})

페이지를 계속해서 방문하면 쿠키를 지우거나, 새 브라우저를 방문하거나, 시크릿 모드로 전환하거나, Django의 세션 ID 쿠키를 회피하는 다른 작업을 수행 할 때까지 값이 1부터 증가하기 시작하는 것을 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.