5

質問

djangoビューで使用set_test_cookieすると、実際にテストCookieを設定できず、その理由がわかりません。

再現する手順

実際のプロジェクトはこれよりもはるかに複雑ですが、ほぼ空のプロジェクトでエラーを再現できます。

シェル

$ virtualenv venv
$ source venv/bin/activate
(venv)$ pip install django
(venv)$ django-admin.py startproject hellodjango .
(venv)$ python manage.py startapp polls

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'database.db',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

urls.py

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    url(r'^login/$', 'hellodjango.polls.views.login'),
)    

polls / views.py

from django.shortcuts import render_to_response
from django.http import HttpResponse

def login(request):
    if request.method == 'POST':
        if request.session.test_cookie_worked():
            request.session.delete_test_cookie()
            return HttpResponse("You're logged in.")
        else:
            return HttpResponse("Please enable cookies and try again.")
    request.session.set_test_cookie()
    return HttpResponse("Look ma, no cookies!")

シェル

(venv)$python manage.py runserver

ブラウザ

localhost:8000 / login /に移動し、getリクエストにソースごとの名前testcookieと値を持つ応答Cookieが表示されないことに注意してください。workedset_test_cookie

4

1 に答える 1

6

実際、それは機能します!Cookieを無効にしてWebサイトにアクセスし、自分の目で確かめることをお勧めします。

とにかく、ここに説明があります:

のソースを見るとset_test_cookie、Cookieなどではなく(少なくとも直接ではなく)、現在のセッションで実際に変数が設定されていることがわかります。

仕組みは次のとおりです。

  1. を呼び出すと、現在のセッションに価値set_test_cookieのあるキーが追加されます。TEST_COOKIE_NAMETEST_COOKIE_VALUE
  2. 現在のセッションが変更された__setitem__ため(メソッドを確認してください)、セッションID(1)Cookieが送信されます(2)
  3. 次のリクエストでデータを取得するときPOST、djangoはキーTEST_COOKIE_NAMEがセッションデータに含まれていて正しい値を持っているかどうかを確認します。

含まれている場合は、リクエストからセッションを取得できたことを意味します。これにより、お客様を識別するために使用したセッションID Cookieが返送されたため(セッションを取得できなかった場合を除く)、Cookieをサポートする必要があります。 。

これにより、状況がより明確になることを願っています。そうでない場合は、HTTPがどのように機能するかを詳細に調べる必要があると思います。

ノート

(1)またはSESSION_COOKIE_NAME設定が設定されているもの。(2)実際には、設定がtrue
の場合、セッションが変更されていなくても、セッションIDCookieが送信されます。SESSION_SAVE_EVERY_REQUEST

于 2012-06-02T23:29:40.400 に答える