django中cookie与session的使用

cookie与session的简介

"""
发展史
1.网站都没有保存用户功能的需求 所有用户访问返回的结果都是一样的
eg:新闻、博客、文章...

2.出现了一些需要保存用户信息的网站
eg:淘宝、支付宝、京东...

以登陆功能为例:如果不保存用户登陆状态 也就意味着用户每次访问网站都需要重复的输入用户名和密码(你觉得这样的网站你还想用吗?)
当用户第一次登陆成功之后 将用户的用户名密码返回给用户浏览器 让用户浏览器保存在本地,之后访问网站的时候浏览器自动将保存在浏览器上的用户名和密码发送给服务端,服务端获取之后自动验证
早期这种方式具有非常大的安全隐患


优化:
当用户登陆成功之后,服务端产生一个随机字符串(在服务端保存数据,用kv键值对的形式),交由客户端浏览器保存
随机字符串1:用户1相关信息
随机字符串2:用户2相关信息
随机字符串3:用户3相关信息
之后访问服务端的时候,都带着该随机字符串,服务端去数据库中比对是否有对应的随机字符串从而获取到对应的用户信息



但是如果你拿到了截获到了该随机字符串,那么你就可以冒充当前用户 其实还是有安全隐患的


你要知道在web领域没有绝对的安全也没有绝对的不安全
"""
cookie
服务端保存在客户端浏览器上的信息都可以称之为cookie
它的表现形式一般都是k:v键值对(可以有多个)
session
数据是保存在服务端的并且它的表现形式一般也是k:v键值对(可以有多个)


下述内容暂时了解即可 先给我搞明白最简单的cookie与session使用再说话!
token
session虽然数据是保存在服务端的 但是禁不住数据量大
服务端不再保存数据
登陆成功之后 将一段用户信息进行加密处理(加密算法之后你公司开发知道)
将加密之后的结果拼接在信息后面 整体返回给浏览器保存
浏览器下次访问的时候带着该信息 服务端自动切去前面一段信息再次使用自己的加密算法
跟浏览器尾部的密文进行比对
jwt认证
三段信息
(后期会讲 结合django一起使用)

总结:
1.cookie就是保存在客户端浏览器上的信息
2.session就是保存在服务端上的信息
3.session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用到cookie)

 

cookies的操作

# 设置cookie

obj = HttpResponse()

obj.set_cookie(key, value)

# 在cookie中设置超时时间, max_age, expires(针对IE浏览器), 两者都是超时时间, 并且都是以秒为单位

obj.set_cookie(key, value, max_age=1, expires=x)

 

# 获取cookie

request.COOKIES.get('键')

# 删除cookie

obj.delete_cookie(key)

 

# 基于cookie的登录认证示例

# cookie登录认证装饰器# def login_auth(func):

#     def inner(request, *args, **kwargs):
# target_url = request.get_full_path()
# print(target_url)
# if request.COOKIES.get('username') == 'jason':
# res = func(request, *args, **kwargs)
# return res
# else:
# return redirect('/login/' + f'?url={target_url}')
#
# return inner



# cookies实现登录认证
# def login(request):
# if request.method == 'POST':
# username = request.POST.get('username')
# password = request.POST.get('password')
# if username == 'jason' and password == '123':
# print('登录成功')
# target_url = request.GET.get('url')
# if target_url:
# obj = redirect(target_url)
# else:
# # 保存用户登录状态
# obj = redirect('index')
# # 登录成功 设置cookies保存在客户端浏览器
# obj.set_cookie('username', 'jason')
# return obj
#
# return render(request, 'login.html')




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


@login_auth
def home(request):
return HttpResponse('不登录就别想看我')


# # 注销, 就是删除cookie
# @login_auth
# def logout(request):
# obj = redirect('login')
# obj.delete_cookie('username')
# return obj









"""

session数据是保存在服务端的(存?),给客户端返回的是一个随机字符串
sessionid:随机字符串

1.在默认情况下操作session的时候需要django默认的一张django_session表
数据库迁移命令
django会自己创建很多表 django_session就是其中的一张

django默认session的过期时间是14天
但是你也可以人为的修改它


# 设置session
request.session['key'] value()

# 设置session超时时间
reques.session.set_expiry()
 

  括号内可以放四种类型的参数
  1.整数 多少秒
  2.日期对象 到指定日期就失效
  3.0 一旦当前浏览器窗口关闭立刻失效
  4.不写 失效时间就取决于django内部全局session默认的失效时间

 # 获取session

  request.session.get(key)

 # 清除session

  request.session.flush()

  request.session.delete()

 

django_session表中的数据条数是取决于浏览器的
同一个计算机上(IP地址)同一个浏览器只会有一条数据生效
(当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过代码清除)

 

request.session['hobby'] = 'girl'
"""
内部发送了那些事
1.django内部会自动帮你生成一个随机字符串
2.django内部自动将随机字符串和对应的数据存储到django_session表中
  2.1先在内存中产生操作数据的缓存
  2.2在响应结果django中间件的时候才真正的操作数据库
3.将产生的随机字符串返回给客户端浏览器保存
"""
request.session.get('hobby')
"""
内部发送了那些事
1.自动从浏览器请求中获取sessionid对应的随机字符串
2.拿着该随机字符串去django_session表中查找对应的数据
3.如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中, 如果比对不上 则request.session.get()返回的是None
"""

基于session的登录认证

# session登录认证装饰器
def login_auth(func):
def inner(request, *args, **kwargs):
target_url = request.get_full_path()
if request.session.get('username'):
res = func(request, *args, **kwargs)
return res
else:
return redirect('/login/' + f'?url={target_url}')

return inner


# session实现登录认证
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
print('登录成功')
# 登录成功 设置session保存在服务端, 并将随机字符返回给客户端保存
request.session['username'] = username
target_url = request.GET.get('url')
if target_url:
return redirect(target_url)
# 保存用户登录状态
# 没有要跳转到的页面就默认跳转到首页
return redirect('index')

return render(request, 'login.html')


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


@login_auth
def home(request):
return HttpResponse('不登录就别想看我')



# 注销, session版
def logout(request):
request.session.flush()
return redirect('login')



from django.views import View
from django.utils.decorators import method_decorator
"""
CBV中django不建议你直接给类的方法加装饰器
无论该装饰器能都正常给你 都不建议直接加
"""

# @method_decorator(login_auth,name='get') # 方式2(可以添加多个针对不同的方法加不同的装饰器)
# @method_decorator(login_auth,name='post')
class MyLogin(View):
@method_decorator(login_auth) # 方式3:它会直接作用于当前类里面的所有的方法
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
# @method_decorator(login_auth) # 方式1:指名道姓
def get(self,request):
return HttpResponse("get请求")

def post(self,request):
return HttpResponse('post请求')

posted @   努力搬砖的zh  阅读(114)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示