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

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

다음과 같이 봅니다.

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

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



답변

업데이트 : 내장 솔루션에 대한 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의 답변을 아래에서 확인하십시오 .


답변

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


답변

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


답변

이 작업에 관심이있는 사람은 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부터 증가하기 시작하는 것을 볼 수 있습니다.


답변