使用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)
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)
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^login/$', 'hellodjango.polls.views.login'),
)
Run Code Online (Sandbox Code Playgroud)
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 源.
实际上,它的作品!您可能希望在禁用Cookie的情况下访问您的网站,并亲自查看.
如果您查看源代码set_test_cookie,您会注意到它实际上在当前会话中设置了一个变量,而不是cookie或任何东西(至少不是直接).
以下是它的工作原理:
set_test_cookie,一个TEST_COOKIE_NAME有价值的键和一个有价值的键TEST_COOKIE_VALUE被添加到你当前的会话中.__setitem__方法),因此将发送一个sessionid(1)cookie(2)POST您在下一个请求中进行数据处理时,django会检查密钥是否TEST_COOKIE_NAME恰好位于会话数据中并且具有正确的值.如果是这样,这意味着我们能够从您的请求中检索您的会话,以便我们用来识别您的sessionid cookie被发回(以免我们无法检索您的会话),因此您必须支持cookie .
希望这能使你的事情更加清晰; 如果没有,我认为你应该研究HTTP的工作原理.
(1)或者SESSION_COOKIE_NAME设置的任何设置.
(2)实际上,如果SESSION_SAVE_EVERY_REQUEST设置为真, 即使会话未被更改,也会发送sessionid cookie