首页 > 其他分享 >django Cookie与Session

django Cookie与Session

时间:2022-12-26 21:13:20浏览次数:26  
标签:return Session get request 用户 django session Cookie 登入

django Cookie与Session

Cookie与Session简介

回忆:HTTP协议四大特征

1.基于请求响应

2.基于TCP的应用层协议

3.无状态:不保存客户端状态

4.无连接

最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的

随着互联网的发展很多网站需要指定当前用户的状态

Cookie:保存在客户端与用户状态相关的信息

Session:保存在服务端与用户状态相关的信息

session的工作需要依赖于cookie

浏览器有资格拒绝保存服务端发送过来的cookie数据

早期客户端:

当你是一次输入用户名和密码时 浏览器(客户端)会有能力记住和保存起来你登入各个网站的用户名和密码 再次访问的时候浏览器帮你发送了你的用户名和密码

这种是直接保存在客户端安全性会非常的低 就比如当你去网吧上网登入微信 QQ假如电脑没有初始化重启 其他人来上网就能看到

随着互联网的发展很多网站需要指定当前用户的状态:

当你第一次输入用户名和密码之后 服务端会给你返回一个随机字符串

浏览器拿着个随机字符串 以后再访问这个服务端 把字符串给到服务端 服务端内部是用户信息对应好了的 哪个用户对应的哪个随机字符串 这样就能够知道你是谁 这样用户数据就保存在服务端了 而浏览器只保存了随机字符串 这样用户信息就在客户端查看不了

session的工作是得依赖cookie

将cookie记录清除 如图:

image

再登入 发现比未登入前多 而这些多出来的就是对身份的唯一标识

image

小知识拓展:

浏览器上是有拒绝保存cookie的 如果勾选上的话所有的登入页面功能都登入不上全部失效

image

因为所有的登入功能在输对用户名和密码之后都得在浏览器上保存一个随机字符串 而现在本地是没有保存随机字符串的功能了 那么服务端想给你发随机字符串却保存不了

这样每一次在登入请求时都得自己输用户名和密码 可却又去无法保存服务端发送过来的随机字符串 这样一来所有的登入功能都实现不了

总结:

cookie:保存在客户端与用户状态相关的信息

session:保存在服务端与用户状态相关的信息

session的工作需要依赖于cookie

django操作cookie

from django.shortcuts import render,HttpResponse,redirect
return render()
return HttpResponse()
return redirect()

要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收
obj1 = render()
return obj1
obj2 = HttpResponse()
return obj2
obj3 = redirect()
return obj3
def index_func(request):
    if request.method == 'POST':
        res = HttpResponse('登录成功')
        res.set_cookie('user_name', request.POST.get('username'))  # 键值对不能有中文
        res.set_cookie('pwd', request.POST.get('pwd'))  # 键值对不能有中文
        print(request.COOKIES.get('user_name'))
        return res
    return render(request, 'indexPage.html', locals())

image

登录成功后可以查看的视图函数

def home_func(request):

    if request.COOKIES.get('user_name') == 'ikun':
        return HttpResponse('登录用户')
    return redirect('/index/')

只有用户登入之后才可以随意访问home,这样浏览器就保存了cookie信息为键是name、值是当前登入的用户名

image

需求用户登录之后访问的页面有好几个

如果有很多视图,每个视图都加一个校验用户登录,那就很麻烦了

那么针对频繁操作我们可以写一个装饰器在不修改被装饰对象的源代码及调用方式,进行功能的添加。

装饰器

def login_auth(func):
    def inner(request,*args,**kwargs):
        # print(args,kwargs)
        if request.COOKIES.get('user_name') == 'ikun':
            return HttpResponse('登录用户')
        return redirect('/index/')
    return inner


@login_auth
def home_func(request):

    return HttpResponse('登录用户')

进阶操作:

用户没有登录之前想访问某个网站输入用户名密码之后就应该立马跳转回去

# print(request.path)  # 只获取用户输入的路由信息
# print(request.path_info)  # 只获取用户输入的路由信息
# print(request.get_full_path())  # 获取用户输入的路由信息+问号后面携带的数据

前两个都是获取用户输入的路由信息 第三个是获取用户输入的路由的信息+问号后面携带的数据

def login_auth(func):
    def inner(request, *args, **kwargs):
        # print(args,kwargs)
        if request.COOKIES.get('user_name') == 'ikun':
            return func(request, *args, **kwargs)
        print(request.path)
        return redirect('/index/' + '?next=' + request.path)

    return inner

def index_func(request):
    if request.method == 'POST':
        res = HttpResponse('登录成功')

        if request.GET.get('next'):
            res = redirect(request.GET.get('next'))

        res.set_cookie('user_name', request.POST.get('username'))  # 键值对不能有中文
        res.set_cookie('pwd', request.POST.get('pwd'))  # 键值对不能有中文
        # print(request.COOKIES.get('user_name'))
        print(request.GET.get('next'))

        return res
    return render(request, 'indexPage.html', locals())

@login_auth
def home_func(request):

    return HttpResponse('登录用户')

未登录的

image

登录成功直接跳转

image

总结:

装饰器是把用户登入成功之后的视图函数都装上了

那么用户在没有登入的情况下 就能够拿到用户想要访问的那个路由 但是必须得要先登入

因为只有在执行完登入功能之后才能正真的跳转到一个页面去

那么在跳转到登入功能之前把用户正真想访问的路由塞给登入的这个路由里

这样在登入完之后就可以在request.GET.get拿到用户在登入之前想访问的地址

django操作session

由于session是保存在服务端上面的数据 就应该有个地方能够存

我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表

django默认的session失效时间是14天

设置session

request.session['key'] = values

1.生成一个随机字符串

2.对value数据做加密处理 并在django_session表中存储 随机字符串>>>加密数据

3.将随机字符串也发送一份给客户端保存(cookie)session:随机字符串

获取session

request.session.get('key')

1.自动获取随机字符串

2.去django_session表中根据随机字符串获取加密的数据

3.自动解密数据并处理到request.session.get()中

补充说明

1.可以设置过期时间

2.存储session数据的位置也可以修改

设置session数据

def session_func(request):
    session_value = 'session——张三'
    request.session['username'] = session_value
    return HttpResponse(session_value)

image

获取session数据

def get_session(request):
    username = request.session.get('username')

    return HttpResponse(username)

image

底层原理

自定获取到随机字符串 去django表中获取随机字符串加密的数据在自动解密处理到request.session.get(key)中

设置过期时间

单位是秒

def session_func(request):
    session_value = 'session——张三'
    request.session['username'] = session_value
    request.session.set_expiry(5)
    return HttpResponse(session_value)

过期后在拿就拿不到数据了

image

储存session数据的位置可以修改

可以规定存在表里还是文件里或者缓存数据库里都可以

标签:return,Session,get,request,用户,django,session,Cookie,登入
From: https://www.cnblogs.com/clever-cat/p/17006925.html

相关文章

  • django中间件
    django中间件内容概要django中间件简介django中间件两个重要方法django自定义中间件django中间件三个了解方法基于django中间件实现功能的插拔式设计内容详细djang......
  • Python爬虫学习:Cookie 和 Session 的区别是什么?
    一、含义Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie......
  • cookies与session
    前期cookies最开始的浏览器,每次向服务器的请求都自报家门,即每发一次请求,都把用户名和密码都发过去:当用户第一次把用户名和密码输对了之后。浏览器自动保存用户名和密码。......
  • 基于DJango和Pybind11,实现网络后端调用OpenCV算法
    本Blog来源于实际项目,所采用框架组合中,OpenCV实现算法主体、pybind11完成OpenCV的Python封装、django提供Web应用服务,三者协同配合,共同实现“网络后端调用OpenCV算法,解决特......
  • Django:auth认证模块
    目录一、django的auth认证模块1.什么是auth模块2.生成auth物理表二、创建django-admin账户1.创建超级管理员2.注册超级管理员账户3.登录admin账户三、auth模块中的方法1.导......
  • django中间件
    django中间件django默认有七个中间件并且还支持用户自定义中间件中间件主要可以用于:网站访问频率的校验用户权限的校验等全局类型的功能需求MIDDLEWARE=['......
  • Django之forms组件内容,Django中间件
    目录Django之forms组件内容,Django中间件今日内容概要今日内容详细forms组件渲染标签forms组件展示信息forms组件校验补充forms组件参数补充forms组件源码剖析modelform组件......
  • django forms组件,model from组件
    djangoforms组件,modelfrom组件内容概要forms组件简单使用form组件渲染标签forms组件校验补充forms组件参数补充forms组件源码剖析modelfrom组件forms组件小需求......
  • TensorFlow中的Session
    这一次我们会讲到Tensorflow中的Session,Session是Tensorflow为了控制,和输出文件的执行的语句.运行session.run()可以获得你要得知的运算结果,或者是你所要运......
  • django,多对多,序列化组件,ORM批量操作数据,自定义分页器
    django,多对多,序列化组件,ORM批量操作数据,自定义分页器多对多三种创建方式1.全自动classBook(models.Model):title=models.CharField(max_length=32)authors......