您的位置:首页 > 编程语言 > Python开发

四十一、python学习之Django框架(二):Cookie,Session的相关使用

2018-11-07 18:01 661 查看
版权声明:浅弋、璃鱼的原创 https://blog.csdn.net/qq_35709559/article/details/83828162

三、cookie:

Cookie,有时也用其复数形式Cookies, 指某些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端的数据(通常经过加密)
Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
Cookie是由服务器端生成, 发送给User-Agent(一般是浏览器), 浏览器会将Cookie的key/value保存到某个目录下的笨笨文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie).
Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。服务器可以利用Cookie包含信息的任意性来筛选并经常性维护这些信息, 以判断在HTTP传输中的状态.
Cookie经典应用: 记住用户名
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储铭感信息如密码, 因为电脑上浏览器可能被其他人使用.

1.Cookie的特点:

  • Cookie以键值对的格式进行信息的存储;
  • Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写到Cookie信息.
  • 当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器.

2.设置Cookie:

可以通过HttpResponse对象中的set_cookie方法来设置cookie.

HttpResponse.set_cooklie(cookie名, value=cookie值, max_age = cookie有效期)

  • max_age:单位秒, 默认为None;
  • 如果是临时cookie,可将max_age设置为None.

代码:

def demo_view(request):
response = HttpResponse("OK")
response.set_cookie('itcast1", "python")	# 临时cookie
response.set_cookie("itcast2", "python2", max_age=60*60)	# 有效期一小时

效果演示:

3.读取cookie:

可以通过HttpResponse对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。
代码演示:

def demo_view(request):
cookie1 = request.COOKIES.get("itcast1")
print(cookie1)
return HttpResponse("OK")

演示效果:

4.小结:

4.1 设置cookie:

HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)

4.2 获取cookie:

cookie1 = request.COOKIES.get('key')

四、Session:

1.启用session:

简介:
  Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。注意 会话状态仅在支持 cookie 的浏览器中保留。

Django项目默认启用session.

Session的理解:

  • 广义来讲: session是一种会话机制, 用于记录多次http请求之间的关系,关系就是状态数据,比如登录状态.
  • 狭义来讲: session是一种会话数据, 记录的状态数据, 比如登录之后记录的user_id等.

在setting.py文件的中间件选项中查看:

2. 存储方式:

在settings.py文件中,可以设置session数据的存储方式;
另外session可以保存在数据库、本地缓存( 程序的运行内存中, 全局变量)、文件、redis等 。

2.1 数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式:

# 如果是存放数据库, 一般以db结尾
SESSION_ENGINE='django.contrib.sessions.backends.db'

如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。

数据库中的表如图所示:

表结构如下:

由表结构可知,操作Session包括三个数据:键,值,过期时间。

2.2本地缓存:

存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。

# 如果是存放在本地缓存, 一般以cache结尾
SESSION_ENGINE='django.contrib.sessions.backends.cache'

其中,本地缓存会出现问题: 因为是存放在本地的内存中,所以会出现在脱机情况下出现的跨机访问问题:

例如:

我们这里可以看到: 有两台服务器存储的有session数据, 前面由nginx负责管理访问机制,有可能现在的访问方式是轮询形式, 那么意味着第一次用户进入的是上面的服务器,进行了登录操作,我们把他的登录状态保存到了服务器1里面, 随后用户有进行了其他操作, 然后有登陆进入这个服务器,这次轮询到了服务器2里面,但是这里面没有保存登录状态,这样就会造成用户第二次登录.所以会造成用户跨机的问题.

但是如果我们使用redis就不会出现这样的情况,因为无论是哪一个服务器,最终存储的数据都保存到了redis中 :

2.4 Redis:

参考文章: http://django-redis-chs.readthedocs.io/zh_CN/latest/#cache-backend

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。

1) 安装扩展:

pip install django-redis

2) 配置:

在settings.py文件中做如下设置:

CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 定义django中redis的位置
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
# django使用redis的默认客户端来进行操作.
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 我们定义一个cache(本地缓存来存储信息,cahe指定的是redis)
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 本地的session使用的本地缓存名称是'default', 这个名称就是上面我们配置的caches的名
# 称"default"
SESSION_CACHE_ALIAS = "default"

3)添加代码,查看是否能够存储到redis中去:

urls.py

# url的配置:
from django.conf.urls import url
from . import views

urlpatterns = [
# 保存session数据
url(r'^set_session', views.set_session),
# 获取session数据
url(r'^get_session', views.get_session),
]

views.py

# 定义设置session的视图函数
def set_session(request):
request.session['one'] = '1'request.session['two'] = '2'
request.session['three'] = '3'
return HttpResponse('保存session数据成功')

# 定义获取session的视图函数
def get_session(request):
one = request.session.get('one')two = request.session.get('two')
three = request.session.get('three')
text = 'one=%s, two=%s, three=%s' % (one,two,three)
return HttpResponse(text)

演示效果:
打开redis开查看存储的信息:

打开redis:

redis-server

查看信息: (在新窗口中)

redis-cli

select 1

keys *

3 Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

3.1 以键值对的格式写session。

request.session[‘键’]=值

例如:

request.session['one'] = '1'

3.2根据键读取值。

request.session.get(‘键’)

例如:

one = request.session.get('one')

3.3 清除所有session,在存储中删除值部分。

request.session.clear()

3.4 清除session数据,在存储中删除session的整条数据。

request.session.flush()

3.5 删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

3.6 设置session的有效期

request.session.set_expiry(value)
  • 如果value是一个整数,session将在value秒没有活动后过期。
  • 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
  • 如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。其中 SESSION_COOKIE_AGE的单位是以秒为单位的.
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: