持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
Cookie 与Cession
Cookie 机制:正统的Cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上 一行特殊的指示以提示浏览器按照指示生成相应的Cookie。然而纯粹的客户端脚本如JavaScript或者 VBScript 也可以生成Cookie。而Cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所 有存储的Cookie,如果某个Cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附 在请求资源的HTTP请求头上发送给服务器。
Session 机制:Session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是 使用散列表)来保存信息。
Cookie的使用
继续修改.../sign/views.py 文件: views.py
登录成功后,在跳转到event_mange页面时,通过 set_cookie()方法来添加浏览器Cookie。
我们给set_cookie(方法传了三个参数,第一个参数“user”是用于表示写入浏览器的Cookie名,第二个 参数username是由用户在登录页上输入的用户名,第三个参数3600用于表示该cookie信息在浏览器的时间, 默认以秒为单位。
而在event_manage 视图函数中,通过 request.COOKIES来读取Cookie名为“user”的值。并且通过render 将和event_manage.html页面一起返回给客户端。
修改../templates/event_manage.html页面,添加<div>标签
重新再来登录一次,页面如图
Session的使用
Cookie固然好,但存在一定的全安隐患。Cookie像我们以前用的存折,用户的存钱、取钱都会记录在这张存折上,那么对于有非分想法的人可能会去修改存折上的数据(这个比喻忽略掉银行同样会记录用户存取款的金额)。
相对于存折,银行卡要全安的得多,客户拿到的只是一个银行卡号(Sessionid),那么用户的存钱、取钱都会记录在银行的系统里(服务器端),用户(客户端)只能看到一个卡号,银行来查询这个卡号上存款的记录。Session就类似于我们的银行卡。
在Django中使用Session和Cookie类似。我们只用将Cookie的几步操作替换成 session即可。修改../sign/views.py文件,在login_action函数中,将:
response.set_cookie('user', username, 3600)
替换为:
request.session['user'] = username # session 信息记录到浏览器
在event_manage函数中,将:
username = request.COOKIES.get('user', ")
替换为:
username = request.session.get('user', ") # 读取浏览器 session 再次尝试登录,不出以外的话将会得到一个错误。
"no such table: django_session"
这个错误跟Session的机制有关,既然要服务器端记录用户的数据,那么一定要有地方来存放用户Sessionid 对应的信息才会。所以,我们需要创建django_session表。别着急! Django已经帮我们准保好这些常用到的个,只需要将他们生成即可。
通过“migrate”命令进行数据迁移。
等等,我们好像并没配置数据库啊,为数据表已经生成了呢?这是因为Django已经默认帮我设置sqlite3数据库。打开./settings.py文件。
另外,在guest项目的根目录下会生成一个db.sqlite3文件。关于数据的操作我们会放在下一章讨论。此时,先来验证Session功能是否生效,重新登录。