Loading

Django-Cookie-Session

一、cookie介绍

Cookie的由来:

因为HTTP协议是无状态的,也就是说每次请求都是独立的,它的执行情况和结果都与前面的请求和之后的请求都没有直接关系,不会被前面的请求直接影响,也不会直接影响后面的请求

什么是Cookie:

Cookie是浏览器技术,具体指的是一小段信息,是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器就会自动携带这些键值对,让服务器提取有用信息。

Cookie原理:

当浏览器访问服务端时,带着一个空的Cookie,并由服务器产生cookie内容给浏览器,浏览器收到后保存在本地,当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容判断这是 “谁” 了。

Cookie与HTTP头:

Cookie是通过HTTP请求和响应头在客户端和服务端传递的:

  • Cookie:请求头,客户端发送给服务端

  • 格式:

    • 请求头—>Cookie:k1=v1; k2=v2 多个cookie用分号隔开

    • 响应头:一个Cookie对象对应一个Set-Cookie

      Set-Cookie: Set-Cookie: k1=v1 Set-Cookie: k2=v2

二、Django操作Cookie

Ctrl + Shift + Del :清除页面缓存和cookie。

设置Cookie:

rep = render(request, 'index.html')
rep.set_cookie('key', 'value')
rep.set_signed_cookie('key', 'value')


"""
参数:
	key:--------------键
	value:------------值
	max_age=None:-----超时时间,秒为单位,默认是None,延续到浏览器关闭。
	expires=None:-----超时时间,datetime类型,到这个日期就失效。
	path='/':---------cookie的生效路径,/ 表示根路径,可以被任何url的页面访问
	domain=None:------cookie生效的域名,默认None只能由设置它的站点读取。
	secure=False:-----如果设置为True,浏览器将通过HTTPS来回传cookie。
	httponly=False:---只能是http协议传输,无法被JavaScript获取

"""

获取Cookie:

request.COOKIES['key']
request.COOKIES.get('key')
request.get_signed_cookie('key', default=RAISE_ERROR, salt='', max_age=None)


"""
参数:
	default:-----默认值
	salt:--------加密盐
	max_age:-----后台控制过期时间
"""

删除Cookie:

def quit(request):
    rep = redirect('login')
    rep.delete_cookie('name')  # 删除用户浏览器上之前设置的name cookie值
    return rep

Cookie版登陆校验示例:

from django.shortcuts import render, redirect


# 装饰器,判断cookie是否正确
def login_check(func):
    def inner(request, *args, **kwargs):
        login_id = request.COOKIES.get('is_login')
        if login_id == 'True':
            ret = func(request, *args, **kwargs)
            return ret
        else:
            return redirect('login')
    return inner


# 登录视图
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        name = request.POST.get('uname')
        pwd = request.POST.get('pwd')
        if name == 'xiaoyang' and pwd == '123':
            rep = redirect('index')
            rep.set_cookie('is_login', 'True')
            return rep
        else:
            return redirect('login')

@login_check
def index(request):
    return render(request, 'index.html')

# 退出删除cookie
@login_check
def quit(request):
    rep = redirect('login')
    rep.delete_cookie('is_login')  # 删除用户浏览器上之前设置的name cookie值
    return rep

三、session

Session是服务端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独有的session对象,并且该对象对应者该用户的资源,以一条记录的形式存在服务端,当浏览器带着session再次访问服务器时,服务器会取出session去查找对应的资源给用户。

因为资源(如同cookie一样的键值对)是放在服务端的,浏览器缓存到的只是一串字符串,并不是如同cookie一样有标志性的信息,所以相对而言比较安全

四、Django操作session

设置值:

1、生成了——>session_id:随机字符串

2、在cookie里面加上了一个键值对——>session_id:随机字符串

3、将用户的数据进行加密,并保存到django-session表里面。

request.session['key'] = 'value'
request.session.setdefault('key', 'value') 	# 存在则不设置

获取值:

1、从cookie里面拿出session_id:xxxx这个随机字符串

2、去django-session表里面查询到对应的数据

3、反解加密的用户数据,并获取用户需要的数据

request.session.get('key')					# key的值
request.session.keys()						# 所有键
request.session.values()					# 所有值
request.session.items()						# 所有键值对
session_key = request.session.session_key 	# 获取sessionid的值,也就是随机字符串
request.session.exists("session_key")		# 检查会话session的key在数据库中是否存在

删除值:

del request.session['key']		# 删除key对应的值,表里同步删除
request.session.delete()		# 删除当前会话的所有session数据
request.session.flush()			# 常用-清空所有cookie---删除session表里的这个会话的记录,
request.session.clear_expired()	# Session失效日期小于当前日期的数据删除

设置会话Session和Cookie的超时时间

request.session.set_expiry(value)

# 如果value是个整数,session会在些秒数后失效。
# 如果value是个datatime或timedelta,session就会在这个时间后失效。
# 如果value是0,用户关闭浏览器session就会失效。
# 如果value是None,session会依赖全局session失效策略。

Session版登录校验:

from django.shortcuts import render, redirect


# 装饰器,判断session获取值是否正确
def login_check(func):
    def inner(request, *args, **kwargs):
        login_id = request.session.get('is_login')
        if login_id == 'True':
            ret = func(request, *args, **kwargs)
            return ret
        else:
            return redirect('login')
    return inner


# 登录判断和session设置
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        name = request.POST.get('uname')
        pwd = request.POST.get('pwd')
        if name == 'xiaoyang' and pwd == '123':
            request.session['is_login'] = 'True'
            return redirect('index')
        else:
            return redirect('login')


@login_check
def index(request):
    return render(request, 'index.html')


# 退出登录,浏览器和服务端删除session
@login_check
def quit(request):
    request.session.flush()
    return render(request, 'login.html')

五、Django中的session配置

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   	# 引擎(默认)

2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  	# 引擎
SESSION_CACHE_ALIAS = 'default'                            	# 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                  # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None               	# Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False               # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True              # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False     # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False          # 是否每次请求都保存Session,默认修改之后才保存(默认)
posted @ 2021-06-25 10:01  Mr-Yang`  阅读(80)  评论(0编辑  收藏  举报