Django Cookieを設定するにはどうすればよいですか?


123

訪問者が選択した場所に基づいてさまざまなコンテンツを表示するWebサイトがあります。例:ユーザーは55812にzipとして入力します。私はどの都市と地域の緯度/経度を知っています。つまり、その領域に関連するコンテンツを提供します。私の質問は、これをCookieに保存して、返却時に郵便番号を常に入力する必要がないようにする方法を教えてください。

私はそれを次のように見ています:

  1. それらの領域に基づいて永続的なCookieを設定します。
  2. 読み取りCookieが返されたら、郵便番号を取得します。
  3. Cookieの郵便番号に基づいてコンテンツを返します。

クッキーの設定に関する確かな情報が見つからないようです。どんな助けでも大歓迎です。


cookierendering a template一緒に設定を探している人は、この回答を参照してください。
TheGuardener

回答:


66

更新:組み込みの解決策については、以下のピーターの答えを確認してください:

これは永続的なクッキーを設定するヘルパーです:

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

更新:組み込みの解決策については、以下のピーターの答えを確認してください:


settings.SESSION_COOKIE_DOMAINが設定されていない場合、問題はありますか?
panchicore 2010

1
とにかく、django自体がデフォルトのSESSION_COOKIE_DOMAINを設定します。複数のサブドメイン間でCookieを共有する必要がある場合は、この設定について検討してください。
jujule 2010

12
-1その上で、Djangoはセットクッキーに方法が付属していますがdocs.djangoproject.com/en/dev/ref/request-response/...
fetzig

2
@klemens:はい、私の例では最後にdjangoメソッドを呼び出します。日付の処理を簡略化する(2009年からの)単なるショートカットです。
2007年

5
私は気にしないが、fyi:役に立たないヘルパー関数は2009年にはすでに役に立たなかった。docs.djangoproject.com/en /1.0 /ref/request-response/…(私が知る限り、2008年9月にdjango 1.0がリリースされた)
fetzig

259

Djangoのセッションフレームワークを使用すると、ほとんどのシナリオがカバーされますが、Django は、要求オブジェクトと応答オブジェクトに直接Cookie操作メソッドを提供するようにもなりました(ヘルパー関数は必要ありません)。

クッキーを設定する:

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

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

10
更新するだけです-「has_key」は「in」に置き換えられました。
skaz 14

15
もっとpythonicな方法はrequest.COOKIES.get( 'cookie_name')を呼び出すことです
Charlesthk

ばかげた質問をさせてください、このCookieは他の使用セッション間で持続しますか?
ディエゴ・ヴィニシウス

ここで追加する価値のあるものはありませんが、フレームワークソリューションが存在する場合は、ジョブにカスタムヘルパー関数を使用するよりも、多くの場合それらを使用する方が良いです。これらのソリューションは最初は利用できなかったかもしれませんが、確かに利用できるので、なぜそれらを使用しないのですか?それはより単純なコードを作成し、カスタムヘルパーが処理することを考えるよりも多くのケースを処理する可能性があります。
vincent-lg

2
:あなたはDjangoの要求オブジェクトからDjangoのレスポンスオブジェクトを作成する方法を迷っている場合は、この読み取りstackoverflow.com/questions/17057536/...
critikaster

19

手動でCookieを設定することもできますが、ユースケースによっては(そして、将来、より多くのタイプの永続/セッションデータを追加したい場合は)、Djangoのセッション機能を使用する方が理にかなっている可能性があります。これにより、ユーザーのセッションCookieに内部的に関連付けられた変数を取得および設定できます。これのクールな点は、ユーザーのセッションに関連付けられた大量のデータを保存したい場合、それらすべてをCookieに保存すると、HTTP要求と応答に大きな負荷がかかることです。セッションでは、セッションCookieがすべてやり取りされます(ただし、Djangoがセッションデータを保存するためのオーバーヘッドがあることに注意してください)。


4
いい視点ね!1つの注意点は、静的コンテンツを別のドメイン(サブドメインではなく)でホストすることでHTTPの重みを減らし、Cookieがそれらのリクエストで送信されないようにすることです。stackoverflow.com/questions/72394/...
ジョンPaulett

Djangoセッションフレームワークが存在するため、@ JohnPaulettのコメントは古くなっています。Cookieベースのワークフローでの合計データストレージを最小限に抑える必要はもうありません。
Chris Conlan

0

これに興味がある人はDjango Sessionsフレームワークのドキュメントを読んでください。セッションIDをユーザーのCookieに保存しますが、すべてのCookieのようなデータをデータベースにマッピングします。これは、HTTPリクエストの一般的なCookieベースのワークフローの改善です。

以下は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', {})

何度もページにアクセスし続けると、Cookieをクリアするか、新しいブラウザでアクセスするか、シークレットモードになるか、DjangoのセッションID Cookieを回避するその他の操作を行うまで、値が1から増加し始めます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.