django set_test_cookie无法设置cookie

时间:2012-06-02 23:08:46

标签: python django

问题

在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'),
)    

轮询/ 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 /并注意到您的获取请求未显示名称为testcookie的响应Cookie,并且worked未显示set_test_cookie {{3 }}

1 个答案:

答案 0 :(得分:6)

实际上,它有效!您可能希望在禁用Cookie的情况下访问您的网站,并亲自查看。

无论如何,这是解释:

如果你查看set_test_cookie的来源,你会发现它实际上在当前会话中设置了一个变量,而不是cookie或任何东西(至少不是直接)。

以下是它的工作原理:

  1. 您致电set_test_cookieTEST_COOKIE_NAME和价值TEST_COOKIE_VALUE的密钥会添加到您当前的会话中。
  2. 您当前的会话已修改(请检查__setitem__方法),因此a sessionid (1) cookie will be sent(2)
  3. 当您在下一个请求中POST数据时,django会检查密钥TEST_COOKIE_NAME是否恰好位于您的会话数据中并且具有正确的值。
  4. 如果是的话,这意味着我们能够从您的请求中检索您的会话,以便我们用来识别您的sessionid cookie被发回(以免我们无法检索您的会话),所以你必须支持cookies。

    希望这会让事情变得更加清晰;如果没有,我认为你应该研究一下HTTP的工作原理。

    注释

    (1)或SESSION_COOKIE_NAME设置的任何设置 (2)实际上,即使在SESSION_SAVE_EVERY_REQUEST设置为真的情况下未改变会话,也会发送一个sessionid cookie