学习笔记,仅供参考,有错必究
文章目录
- cookies和session
- session
- Django启用Session
- session的基本操作
- session 示例
cookies和session
session
session的意思就是会话,session可以在服务器上开辟一段空间,保留浏览器和服务器交互时的重要数据(重要数据一定是存储在服务器上),每个客户端都可以在服务器端有一个独立的session;
http协议是无状态的,即每次请求都是一次新的请求,服务器不会记得之前通信的状态,客户端与服务器端的一次通信,就是一次新的会话,实现状态保持的方式就是在客户端或服务器端存储与会话有关的数据;
我们推荐使用sesison方式,将所有数据存储在服务器端,在客户端cookie中存储session_id;
需要注意的是,不同的请求者之间不会共享数据,请求者与响应是一一对应的关系。
Django启用Session
我们打开settings.py文件,在INSTALLED_APPS列表中添加(如果已经存在就不再添加):
INSTALLED_APPS = [# 启用 sessions 应用
'django.contrib.sessions',
]
在MIDDLEWARE_CLASSES列表中添加(如果已经存在就不再添加):
MIDDLEWARE = [# 启用 Session 中间层
'django.contrib.sessions.middleware.SessionMiddleware',
]
session的基本操作
session对象是一个类似于字典的SessionStore对象, 可以用类似于字典的方式进行操作,session只可以存储能够序列化的数据,如字典,列表等。
- 保存 session 的值到服务器
#VALUE为Python中的基础数据类型
- 获取session的值
#或
VALUE = request.session.get('KEY', 缺省值)
- 删除session的值
- 在 settings.py中有关 session 的设置
#作用:指定session_id在cookies中的保存时长
#例如:SESSION_COOKIE_AGE = 60*30
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
#若为True, 则只要浏览器关闭时, session就失效
- 注意事项
当使用session时需要迁移数据库,否则会出现错误,这是因为session看起来是一个字典,但实际上,session需要把它的内容序列化到数据库中。
python manage.py makemigrationspython manage.py migrate
session 示例
我们在主视图模块views.py中加入两个视图函数:
def test_session(request):# 为session 添加mykey 对应的值
request.session['mykey'] = ['山羊', '黑山羊']
return HttpResponse('设置成功')
def show_session(request):
# 取出sesssion中,mykey对应的数据
value = request.session.get('mykey', 'mykey没有对应的值')
s = str(value)
return HttpResponse(s)
在主urls.py文件中,加入俩路由:
from django.urls import re_pathfrom django.contrib import admin
from django.conf.urls import include
from . import views
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^show_session/', views.show_session),
re_path(r'^test_session/', views.test_session),
]
向http://127.0.0.1:8000/test_session/发起请求:
再向http://127.0.0.1:8000/show_session/发起请求:
当我们关闭浏览器,再访问http://127.0.0.1:8000/show_session/,发现我们的session依然存在,这是因为session是保存在服务器端,而不是浏览器端。
我们打开浏览器的开发者工具DevTool,进入Application下的Cookies,可以看到列表中有一个sessionid:
当我们使用自定义视图函数test_session创建一个session时,浏览器会自动创建一个不重复的sessionid,客户端会拿着这个sessionid在服务器端找到对应的session。
现在,我们删除这个sessionid,再刷新一下http://127.0.0.1:8000/show_session/,就可以发现找不到session了:
这是因为,我们删除sessionid之后,服务器端就不知道我们要的是哪一个session了。
现在,我们向http://127.0.0.1:8000/test_session/发起请求,再创建一个session,并向http://127.0.0.1:8000/show_session/发起请求:
修改视图函数test_session,准备删除服务器端的session:
def test_session(request):del request.session['mykey']
return HttpResponse('设置成功')
向http://127.0.0.1:8000/test_session/发起请求,将服务器端的session删除,并查看http://127.0.0.1:8000/show_session/:
嗯,session已经被删除了!
但需要注意的是,虽然我们的session在服务器端被删除了,但是我们的浏览器依然保存着sessionid:
这有点类似于,我们的银行账户被冻结了,但是我们依然保留着该卡号的银行卡。