郑统京 发表于 2022-10-21 00:52:40

如何通过Django操作cookie操作

# cookie和session
发展史
1.网站都没有保存用户功能的需求 所有用户访问返回的结果都一样
    eg:新闻、博客、文章
   
2、出现了一些需要博爱村用信息的网站
    eg:淘宝、京东、支付宝、
[]
    以登录功能为例:如果不保存用户登陆状态,也就意味着用户每次访问网站都需要重复输入用户名和密码(你觉得还想要继续使用吗)
当用户第一次登录成功之后 将用户的用户名和面膜返回给用户浏览器 让用户浏览器保存本地,之后访问网站的时候浏览器自动将保存的
用户名和密码发送服务端,服务端获取之后做验证
    早期这种方式非常大的安全隐患
[]
    优化:
      当用户登陆成功之后,服务端会随机产生一个字符串(在服务端保存用户数,用k,v键值对的形式),交给客户端保存
            随机字符串1:用户1相关信息
            随机字符串2:用户2相关信息
            随机字符串3:用户3相关信息
      之后访问服务端的时候,都带着该随机字符串,服务端去数据库比对时候有对应的随机字符串从而获取到用户的信息
    但如果你拿到了或者截获到了该随机字符串,那么你就可以充当当前用户 其实还是有安全隐患的
    你要知道在web领域没有绝对的安全和不安全
[cookie:
    服务端保存在客户端的浏览器上的信息都成之为cookie
    他的表现形式一般都是k:v键值对(可以有多个-
[session:
    数据是保存在服务端的,一般也是kv键值对
下述内容暂了解即可,先给我搞明白session和cookie使用在说话!]

[token:
    session虽然数据是保存在服务端的 但是禁不住量大
    服务端不在保存数据
      登陆成功之后 讲一段信息进行加密处理(加密算法之后你公司开发知道)
      将加密之后的结果拼接在信息后面 整体信息返回给浏览器保存
      浏览器下次访问的时候带着该信息 服务端自动切取前面一段信息再次使用自己的加密算法,
      去和浏览器尾部的密文进行比对]

jwt认证
    三段信息
    后期会讲

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

# cookie
虽然cookie是服务端告诉客户端浏览器需要保存的内容
但是客户端浏览器可以选择拒绝保存如果禁止了 那么 只要是需要记录用户状态网站登录功能都无法正常使用

[视图函数的返回值]
return HttpResponse()
return render()
return redirect()obj1 = HttpResponse()
# 操作cookie
return obj1
obj2= render()
# 操作cookie
return obj2
obj3 = redirect()
# 操作cookie
return obj3
如果你想要操作cookie,你就不得不利用obj对象

[设置cookie]
    obj.set_cookie(key,value)
[获取cookie]
    request.COOKIES.get(key)
在设置cookie到时候可以添加一个超时时间
    obj.set_cookie('username','jason666',max_age=3,expires=3)

前戏
def login(request):
    if request.method == 'POST':
      username = request.POST.get('username')
      password = request.POST.get('password')
      if username == 'jason' and password == '123':
            obj=redirect('/home/')
            obj.set_cookie('username', 'jason666')
      return obj
    return render(request,'login.html')

def home(request):
    if request.COOKIES.get('username') == 'jason666':
      return HttpResponse('我是登录后才能看的界面')
    return redirect('/login/')def login_auth(func):
    def inner(request,*args,**kwargs):
      # print(request.path_info)
      # print(request.get_full_path())# 能够获取到用户上一次想要访问的url
      target_url = request.get_full_path()
      if request.COOKIES.get('username'):
            return func(request,*args,**kwargs)
      else:
            return redirect('/login/?next=%s'%target_url)
    return inner

[推导出的完成一个真正的登录功能
def login_auth(func):
    def inner(request,*args,**kwargs):
      # print(request.path_info)
      # print(request.get_full_path())# 能够获取到用户上一次想要访问的url
      target_url = request.get_full_path()
      if request.COOKIES.get('username'):
            return func(request,*args,**kwargs)
      else:
            return redirect('/login/?next=%s'%target_url)
    return inner

def login(request):
    if request.method == 'POST':
      username = request.POST.get('username')
      password = request.POST.get('password')
      if username == 'jason' and password == '123':

            # 获取用户上一次想要访问的url
            target_url = request.GET.get('next')# 这个结果可能是None
            if target_url:
                obj = redirect(target_url)
            else:
                # 保存用户登陆状态
                obj = redirect('/home/')
            # 让浏览器记录cookie数据
            obj.set_cookie('username', 'jason666')
            # 超时时间3秒到期
            """
            浏览器不单单会帮你存
            而且后面每次访问你的时候还会带着它过来
            """
            # 跳转到一个需要用户登陆之后才能看的页面
            return obj
    return render(request,'login.html')


@login_auth
def home(request):
    # 获取cookie信息 判断你有没有
    # if request.COOKIES.get('username') == 'jason666':
    #   return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
    # # 没有登陆应该跳转到登陆页面
    # return redirect('/login/')
    return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")




郑统京 发表于 2022-11-1 00:32:39

如何来实现登录认证装饰的功呢?1、先把登录认证装饰器模板写出来
def login_auth(func):
    def inner(*args,**kwargs):
      if request.COOKIES.get('username'):
            return func(*args,**kwargs)
      else:
            return redirect('/login/')
    return inner
2、研究如何在未登录前可以把自己想访问的页面,等候后跳转过去,而不是只是跳到自己写死home页面?   1、我们对于装饰器先做个变形,因为我们是基于request的完成的一切操作,我们想办法把request传过去才对       eg:          def inner(request,*args,**kwargs):   2、我们拿到request后可以利用request.get_full_path()获取到当前输入的url(request.path_info这个可以获取到用户输入的参数)   3、当我们可以拿到用户输入的参数后,我们可以利用未登录返回的参数做一个简单的拼接,把这个路径的值传回login做处理      eg:         def inner(request,*args,**kwargs):            target_url=request.get_full_path()            if request.COOKIES.get('username'):                  return func(*args,**kwargs)
            else:
                  return redirect('/login/?next=%s'%target_url)   4、这样就可以把数据交给login函数去做下一步处理了,可以直接通过request.GET.get('next')方法获取到传来的url进行redirect跳转      eg:         def login(request):            if request.method == 'POST':
               username = request.POST.get('username')
               password = request.POST.get('password')
               if username=='jason' and password=='123':
                # 获取当前路径
                   tatget_url = request.GET.get('next') [可能为None,当没有走装饰器的时候,直接走login那么会走else里面]
                   if target_url:
                     # 保存用户登陆状态
                     obj=redirect(target_url)
                   else:
                     obj = redirect('/home/') 代表用户只是点了登录页而已,那么我们自己手东帮他跳转一个页面即可了
            # 让浏览器记录cookie数据
               obj.set_cookie('username','jason666')
            # """
            # 浏览器不单单会帮你存
            # 而且后面每次访问你的时候都还会带着他过来
            # """
            # 跳转到一个登录之后才能看的页面
               return obj
         return render(request,'login.html')   5、上面代码实现思路是,先获取到未登录传来的url,然后进行判断,如果获取到了,直接obj=redirect('target_url')跳转到目标页,   如果没有获取到值也没有关系,代表着用户只点了登录页面,我们自己可以设定用户点击登录后跳转到指定页既可以了,但是比较重要的   obj.set_cookie('username','jason666'),只要登录的账号和密码正确是自己设置的jason和123,那么就会产生cookie值,当我们进行,   跳转的时候,登录认证会去校验是否有cookie然后在访问目标页面,这样可以完成需求了   eg:         @login_auth      def index(request):             return HttpRersonse('index页面')

郑统京 发表于 2022-11-1 23:50:00

1、cookie还有两种用法:
a:设置超时 max_age(秒),expires(秒)针对IE浏览器设置的超时
   obj.set_cookie('username'='jason',max_age=5)

b:删除功能 delete_cookie@login_auth
def logout(request)
   obj=redirect('/login/')
   obj.delete_cookie('username')
   return obj



页: [1]
查看完整版本: 如何通过Django操作cookie操作