一:Cookie:
1:cookie的作用:用Cookie机制记住用户的登录状态,实际上是一小段存储在用户浏览器中的文本信息。
2:cookie的工作机制:
2.1:客户端向服务器发起请求,如果服务器需要记录该用户状态,就通过响应向客户端浏览器颁发一个Cookie。
2.2:客户端浏览器会把Cookie保存起来
2.3:当浏览器再次请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。
2.4:服务器检查该Cookie,以此来辨认用户状态。
3:cookie的特点:
Cookie,以键值对Key-Value形式进行信息的存储
Cookie,基于域名安全,不同域名的Cookie是不能互相访问的
例如: 保存在www.baidu.com域名下面的Cookie是不能被其他域名访问的
Cookie,它会自动跟随当前的请求传递到对应域名所在的服务器中。
4:设置cookie(重点):
格式:响应对象.set_cookie(键,值,有效期)
响应对象可以是任何一个:
HttpResponse():响应多种数据类型
JsonResponse():响应JSON
redirect():重定向
render():渲染并响应HTML模板,
最常用的是HttpResponse()
临时cookie则将max_age设置为None,如果是有具体有效期的Cookie,可将max_age设置为具体的秒数。
案例:设置cookie:
class BooksView(View):
"""测试模板
http://127.0.0.1:8000/books/
"""
def get(self, request):
# 查询所有图书信息
books = BookInfo.objects.all()
# 构造上下文
context = {
'books': books
}
# 使用上下文渲染'book.html',并返回给客户端
response = render(request, 'books.html', context)
# 设置Cookie
response.set_cookie('name', 'itcast', max_age=None)
# 响应结果,并写Cookie到浏览器
return response
5:读取cookie:
可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。
class TestCookieView(View):
"""测试Cookie
http://127.0.0.1:8000/cookies/
"""
def get(self, request):
# 读取Cookie
name = request.COOKIES.get('name')
print(name)
return http.HttpResponse('测试Cookie')
二:Session:
1:session介绍:
Session,是一种会话控制方式。由服务端创建,并且保存在服务端的数据存储形式。
Session,内部也是以key-value 键值对的形式存储数据。
Session,有些内容会被加密,所以可以存储敏感信息。
2:处理session数据的子应用有哪些??
首先住配置文件里面注册子应用的地方,可以发现有个session的子应用:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig',
'request_response.apps.RequestResponseConfig',
'booktest.apps.BooktestConfig',
]
其次还有处理session的中间件:
下面的第二行:‘django.contrib.sessions.middleware.SessionMiddleware’,
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'middlewares.TestMiddleware1', # 注册自定义的中间件1
'middlewares.TestMiddleware2', # 注册自定义的中间件2
]
注:如果想要禁用session,则可以直接注释掉这行。
3:session的运行机制:
客户端向服务器发起请求,如果服务器需要记录该用户状态,就可以通过Session在服务端将该用户的唯一标识信息存储起来。session_key:一个随机的唯一的不重复的字符串session_data:用户的唯一标识信息(密文),然后,服务端会向客户端浏览器颁发一个Cookie。该Cookie中包含了Session存储数据时使用的那个session_key,该Cookie的具体形式为:‘sessionid’: ‘session_key’,当浏览器再次请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器提取该Cookie中的session_key,再使用它提取session_data。最后使用session_data来辨认用户状态。
4:session的特点:
存储敏感、重要的信息
因为session数据是存储在服务端的,不会直接暴露给用户
相比较Cookie可以存储更多的内容
不同的浏览器,对Cookie都有不同的数量和大小的限制
依赖于Cookie
因为session_key需要存储在Cookie中
Session共享
利用独立部署的session服务器(集群)统一管理Session,服务器每次读写Session时,都访问Session服务器。
5:操作session:
5.1:设置session:
class BooksView(View):
"""测试模板
http://127.0.0.1:8000/books/
"""
def get(self, request):
# 查询所有图书信息
books = BookInfo.objects.all()
# 构造上下文
context = {
'books': books
}
# 使用上下文渲染'book.html',并返回给客户端
response = render(request, 'books.html', context)
# 设置Cookie
response.set_cookie('name', 'itcast', max_age=3600)
# 设置Session
request.session['name'] = 'itcast'
# 响应结果,并写Cookie到浏览器
return response
5.2:读取session:
lass TestSessionView(View):
"""测试Session
http://127.0.0.1:8000/session/
"""
def get(self, request):
# 读取Session
name = request.session.get('name')
print(name)
return http.HttpResponse('测试Session')
5.3:session的其他方法:
清除session的所有的值的部分:
request.session.clear()
清除session的整条数据:
request.session.flush()
删除session中的指定键及值,在存储中只删除某个键及对应的值
del request.session['key']
设置session的有效期:
request.session.set_expiry(value)
如果value是一个整数,session将在value秒没有活动后过期。
如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
如果value为None,那么session有效期将采用系统默认值,默认为两周。
可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。
6:session的存储位置:
Session数据默认存储的位置是在settings.py的DATABASES配置项指定的SQL数据库中。
Session引擎默认的配置为
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
1:存储在MySQL数据库中:
session如果存储在mysql数据库中,则会主动生成一个django_session的表,在表中会有三个字段:session_data session_key expire_date
2:存储在本地缓存中:
特点是快,缺点是不能长久保存。
ESSION_ENGINE='django.contrib.sessions.backends.cache'
3:混合存储:优先从本机内存中存取,如果没有则从数据库中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
4:存储在Redis数据库中:
首先必须引入django-redis包:
pip install django-redis
修改配置文件:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
浙公网安备 33010602011771号