django set_test_cookie无法设置cookie

Jef*_*eff 5 python django

题

使用set_test_cookie在Django视图不实际设置检测Cookie,我想不通为什么.

重现步骤

实际项目比这复杂得多,但是,错误在近乎空的项目中是可重现的.

贝壳

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

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

urls.py

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

urlpatterns = patterns('',
    url(r'^login/$', 'hellodjango.polls.views.login'),
)    
Run Code Online (Sandbox Code Playgroud)

民调/ 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!")
Run Code Online (Sandbox Code Playgroud)

贝壳

(venv)$python manage.py runserver
Run Code Online (Sandbox Code Playgroud)

浏览器

转到本地主机:8000 /登录/和通知,您的GET请求不显示名称为响应饼干testcookie和值worked按照该set_test_cookie 源.

Tho*_*zco 6

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

无论如何,这是解释:

如果您查看源代码set_test_cookie,您会注意到它实际上在当前会话中设置了一个变量,而不是cookie或任何东西(至少不是直接).

以下是它的工作原理:

  1. 你打电话set_test_cookie,一个TEST_COOKIE_NAME有价值的键和一个有价值的键TEST_COOKIE_VALUE被添加到你当前的会话中.
  2. 您当前的会话已被修改(检查__setitem__方法),因此将发送一个sessionid(1)cookie(2)
  3. 当POST您在下一个请求中进行数据处理时,django会检查密钥是否TEST_COOKIE_NAME恰好位于会话数据中并且具有正确的值.

如果是这样,这意味着我们能够从您的请求中检索您的会话,以便我们用来识别您的sessionid cookie被发回(以免我们无法检索您的会话),因此您必须支持cookie .

希望这能使你的事情更加清晰; 如果没有,我认为你应该研究HTTP的工作原理.

笔记

(1)或者SESSION_COOKIE_NAME设置的任何设置.
(2)实际上,如果SESSION_SAVE_EVERY_REQUEST设置为真, 即使会话未被更改,也会发送sessionid cookie