通过例子理解Django的session机制
2019-11-12 本文已影响0人
陈某君
Django官方文档写到:
Django 提供对匿名会话(session)的完全支持。这个会话框架让你可以存储和取回每个站点访客任意数据。它在服务器端存储数据, 并以cookies的形式进行发送和接受数据。
下面通过例子理解
第一步,启动SESSION
检查settings.py文件两个地方
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', #第一个地方,默认开启
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', #第二个地方,默认开启
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
第二步,配置数据库
同样是在settings.py文件中
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'accountApp',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
运行迁移,python manage.py migrate
这时,查看数据库可以看到名为django_session的表。
第三步,编写视图函数和url配置器
# myapp/views.py
def login(request):
if request.session.get('username', None) == '123456':
return HTTPResponse('登录成功')
else:
request.session['username'] = '123456'
return HTTPResponse('请登录')
# myapp/urls.py
urlpatterns = [
path('u/login/', views.login),
]
第四步,测试
我们使用httpie工具访问接口
注意响应头中有Set-Cookie: sessionid=oe5c4tclsvq7pn071jnak7481lgqomdp; expires=Tue, 26 Nov 2019 11:42:13 GMT; Max-Age=1209600; Path=/; SameSite=Lax
再来看看数据库中的表**django_session
可以发现session_key和sessionid是一样的。
在django中,HttpRequest.session是一个字典对象,我们可以对他多次编辑,django会自动加密并通过set-cookie响应头返回给浏览器,同时保存到django_session数据库中。这时,浏览器需将set-cookie的内容保存到cookie中并在下一次请求发送给服务端。
使用httpie工具模拟浏览器再一次发送请求并附带cookie
Snipaste_2019-11-12_20-03-45.png