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