飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一: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"
posted on 2020-08-29 20:18  飞行的猪哼哼  阅读(32)  评论(0)    收藏  举报