cookie就是保存在客户端上的和用户相关的状态信息,是一组组键值对。
特性:
为什么要使用cookie?
Http协议是无状态协议,每次请求之间都是相互独立的,没有办法保存状态,所以使用cookie保存状态。
Django中操作cookie
# 获取一个HttpResponce对象
res_obj = HttpResponce('cookie test')
# 设置cookie
# 方式一:
res_obj.set_cookie(key="name", value="jasper")
# def set_cookie(
# self,
# key,
# value="",
# max_age=None,
# expires=None,
# path="/",
# domain=None,
# secure=False,
# httponly=False,
# samesite=None,
# ):
# 方式二:
# res_obj.set_signed_cookie(key='info', value='shanghai', salt='加密')
# def set_signed_cookie(self, key, value, salt="", **kwargs):
return res_obj
request.COOKIE # 字典数据格式 获取普通cookie
request.get_signed_cookie(key="info", salt="加密") # 获取加密的cookie
res_obj.delete_cookie(key="info")
登录认证装饰器
def login_auth(func_name):
# 被装饰对象真正执行
def inner(request, *args, **kwargs):
# 判断是否已经登录
if request.COOKIES.get('is_login') == '1':
res = func_name(request, *args, **kwargs)
return res
# 未登录就将跳转到登陆界面 并在后面携带登陆成功后跳转的路径
else:
path = f'login/?next={request.path_info}'
print(path)
return redirect(to=f'http://127.0.0.1:8000/{path}')
return inner
def home(request):
return render(request, 'home.html')
@login_auth
def index(request):
return render(request, 'index.html')
@login_auth
def func(request):
return render(request, 'func.html')
def login(request):
if request.method == 'POST':
# print(request.POST)
if request.POST.get('username') == 'jasper' and request.POST.get('password') == '123':
# 登陆成功后 判断后缀是否有值
if request.GET.get('next'):
# 有值则跳到后缀所在的地址
res_obj = redirect(to=f"http://127.0.0.1:8000{request.GET.get('next')}")
else:
# 没携带后缀就跳转到home界面
res_obj = redirect(to="http://127.0.0.1:8000/home/")
# 第一次登陆成功设置cookie值
res_obj.set_cookie(key='is_login', value='1')
return res_obj
print(request.GET)
return render(request, 'login.html')
cookie可以验证状态,但是cookie键值对在浏览器中是可见的,而session在浏览器发出登录请求时,随机设置一个cookie值返回给浏览器,这个随机字符串叫做session_id,同时会把你请求带来的数据(session_data)一起作为键值对存储在本地数据库中(django_session表中),下次浏览器带着session_id来时,去库中查找即可。
**特点:**保存在服务器上的一组组键值对,依赖cookie使用。
为什么要使用session?
过程:
工作流程:
session的默认过期时间是两周
session的相关方法
# 设置session
request.session[key] = value
# 获取
request.session.get(key)
# 删除
del request.session[key] request.session.pop(key)
# 会话session的key
request.session.session_key # aqdk9wtdbyudbf373jpqws1kmqgulp3d
# 将所有日期失效的session删除
request.session.clear_expired()
# 判断session中的key是否存在
request.session.exists("session_key")
# 删除当前会话的所有session
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
# 设置session和cookie的超时时间
request.session.set_expiry(value)
#如果value是个整数,session会在些秒数后失效。
# 如果value是个datatime或timedelta,session就会在这个时间后失效。
# 如果value是0,用户关闭浏览器session就会失效。
# 如果value是None,session会依赖全局session失效策略
session实现登录认证功能
def login_auth(func_name):
def inner(request, *args, **kwargs):
session = request.session.get('is_login')
if session == '1':
res = func_name(request, *args, **kwargs)
return res
else:
path = request.path_info
print(path)
return redirect(to=f"http://127.0.0.1:8000/login/?next={path}")
return inner
def login(request):
if request.method == 'POST':
if request.POST.get('username') and request.POST.get('password'):
request.session['is_login'] = '1'
fix = request.GET.get('next')
print(fix)
if fix:
path = f"http://127.0.0.1:8000{fix}"
else:
path = f"http://127.0.0.1:8000/home/"
return redirect(to=path)
return render(request, 'login.html')
def home(request):
return render(request, 'home.html')
@login_auth
def index(request):
return render(request, 'index.html')
@login_auth
def func(request):
return render(request, 'func.html')