django---09---Cookie与Session ╰+攻爆jí腚メ 2022-12-02 00:47 94阅读 0赞 一: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"
还没有评论,来说两句吧...