首页 > 其他分享 >cookie与seccion

cookie与seccion

时间:2022-12-22 21:44:14浏览次数:40  
标签:session return 登录 get request seccion cookie

目录

"""
回忆:HTTP协议的四大特性
	1.基于请求响应
	2.基于TCP、IP作用于应用层之上的协议
	3.无状态
		不保存客户端状态
	4.无连接
"""
了解前缀:
    最开始的网站都不需要用户注册,所有人来访问获取到的数据都是一样的
    随着互联网的发展很多网站需要指定当前用户的状态
cookie
	保存在客户端与用户状态相关的信息
session
	保存在服务端与用户状态相关的信息
 ps:session的工作需要依赖于cookie

补充:浏览器有资格拒绝保存五段发送过来的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

django操作cookie

推导1:

登录页面:
def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            obj = redirect('/home/')  # 登录成功重定向到home主页
            obj.set_cookie('name', 'jason')  # 给对象添加cookie键值对,键是name值是jason
            return obj		# 登录成功重定向顺便保存cookie的键值对
    return render(request, 'login.html')
主页:
def home_func(request):
    return render(request, 'home.html')

只有登录才能查看的页面:
def home1_func(request):
    if request.COOKIES.get('name'):   # 只有我们拿到cookie的值,才允许登录
        return render(request, 'home1.html')
    return redirect('/login/')  # 如果没拿到cookie的值证明没登录,直接跳转到登录页面

image

推导2:

思考;如果有多个页面都需要登录以后才能查看,那么每一个里面都写一个cookie的获取判断,会增繁琐,而且所要修改的代码也会比较多,所以我们想到了装饰器
def login_author(func):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):  # 如果cookie有值
            res = func(request, *args, **kwargs)  # 再执行函数,代表登录了
            return res   # 登录了就正常执行函数
        return redirect('/login/')  # 如果没有值,那代表没登录,那么就跳转到登录页面

    return inner

@login_author   
def home1_func(request):
    return render(request, 'home1.html')   # 只有装饰器判断登录成功才会执行该函数,返回只有登录成功才能看的页面

推导3:

进阶操作:用户没有登录之前想要访问某个网页,那他在输入了账号密码之后,应该直接跳转的就是该网页,这样更合理一点
如何实现该效果:
	1.首先要获取用户没有登录之前想要访问的网页是什么
    	用到的方法:request.path	# /home1/	用户想要访问的路由
        		 request.path_info # /home1/  用户想要访问的路由
            	request.  # /home1/?xxx=yyy	也是访问的路由会携带?后面的
    2.将用户访问的路由加入到登录页面去,这样直接登录页面就可以获取到这个路由
    3.登录判断成功以后直接重定向到用户刚开始想要访问的路由
装饰器变形:
	def login_author(func):
    def inner(request, *args, **kwargs):
        # 先获取用户想访问的是哪个页面
        target_path = request.path_info
        if request.COOKIES.get('name'):  # 如果cookie有值
            res = func(request, *args, **kwargs)  # 再执行函数,代表登录了
            return res
        """下面这句话代表如果用户没登录,那么直接跳转到登录页面,但是会在网页上面携带用户初始想要访问的网页"""
        return redirect('/login/?next=%s' % target_path)

    return inner

登录视图函数变形:
	def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            # 在用户登录的时候,就要判断有没有携带初始想要访问的网页
            tar_get_path = request.GET.get('next')
            print(tar_get_path)
            if tar_get_path:  # 如果有值,那么直接重定向到用户本身想要访问的网页
                obj = redirect(tar_get_path)  # 如果有值,那么对象添加重定向到用户想要访问的页面
            else:
                obj = redirect('/home/')  # 如果没有值,那么直接对象添加重定向到主页
            obj.set_cookie('name', 'jason')  # 不管重定向到哪个位置,都要给对象添加cookie键值对,键是name值是jason
            return obj
    return render(request, 'login.html')

django操作session

由于session是永存在服务端上面的数据,所以就应该有个地方能够存储

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

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

设置session

request.session['key'] = value
	这句话的过程其实是以下步骤:
        1.生成一个随机字符串
        2.对value数据多加密处理,并在django_session表中存储
        	随机字符串>>>:加密数据
        3.将随机字符串也发送给客户端保存(cookie)
        	sessionid:随机字符串
代码展示:
def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            # 在用户登录的时候,就要判断有没有携带初始想要访问的网页
            tar_get_path = request.GET.get('next')
            print(tar_get_path)
            if tar_get_path:  # 如果有值,那么直接重定向到用户本身想要访问的网页
                obj = redirect(tar_get_path)  # 如果有值,那么对象添加重定向到用户想要访问的页面
            else:
                obj = redirect('/home/')  # 如果没有值,那么直接对象添加重定向到主页
            request.session['name'] = username  # 表示添加了session,随之一起发送给客户端  
            return obj
    return render(request, 'login.html')

获取session

request.session.get('key')
	1.自动获取随机字符串
 	2.去django_session表中根据随机字符串获取加密的数据
  	3.自动解密数据并处理到request.session.get()中

代码展示:
    def login_author(func):
    def inner(request, *args, **kwargs):
        # 先获取用户想访问的是哪个页面
        target_path = request.path_info
        if request.session.get('name'):  # 如果session有值
            res = func(request, *args, **kwargs)  # 再执行函数,代表登录了
            return res
        """下面这句话代表如果用户没登录,那么直接跳转到登录页面,但是会在网页上面携带用户初始想要访问的网页"""
        return redirect('/login/?next=%s' % target_path)

    return inner

image

补充说明

1可以设置过期时间
2.存储session数据的位置也可以修改

标签:session,return,登录,get,request,seccion,cookie
From: https://www.cnblogs.com/zhanghong1229/p/16999641.html

相关文章

  • Django-cookie和session
    1.cookies与session简介1.最早期的互联网不需要保存用户信息,所有用户哪怕之前成功登陆每次用户登录也要重新输入账号和密码。2.cookie:保存在客户端与用户状态相关的数......
  • 12月22日内容总结——django中间件的三个了解要求的方法、基于django中间件的功能设计
    目录一、django中间件三个了解的方法二、django中间件五个方法的执行流程详解三、基于django中间件的功能设计功能设计介绍如何利用字符串导入模块功能模拟四、cookie与ses......
  • django之cookie与session
    目录cookie与session简介django操作cookiedjango操作sessioncookie与session简介"""回忆:HTTP协议四大特性 1.基于请求响应 2.基于TCP、IP作用于应用层之上的协议 3.......
  • django中间件三个了解的方法、 基于django中间件的功能设计、 cookie与session简介、
    目录django中间件三个了解的方法基于django中间件的功能设计cookie与session简介django操作cookiedjango操作cookiedjango操作sessiondjango中间件三个了解的方法1.proc......
  • django 12 django中间件,cookie与session
    django中间件#1.所有的请求和响应都必须经过中间件#2.django中间件默认自带七个,每个中间件负责不同的功能"""Django中间件的作用"""-1.修改请求,即传送到vi......
  • Cookie
    Cookie什么是Cookie?在session的实现原理中,每一个session对象都会关联一个sessionIdJSESSIONID=ADA72403E73D3C0F2541BBE159E9C65B以上这个键值对数据就是Cookie对象......
  • Cookie 携带路径详解
    Cookie携带路径详解使用​​cookie.setPath()​​可以设置cookie的携带路径,如果不设置默认也会有一个携带路径,默认为当前路径的上一级路径啥意思?咱们来探究一下吧!先上个Dem......
  • Jmeter获取Cookie并传递到下一个线程
    Jmeter是测试过程中会被用到的一个测试工具,我们即可用来进行压力的压测,也可以用来对接口进行功能检查,不仅仅是HTTP的结果,还有DB、TCP、FTP等等。当然它还有很多其它有用的功......
  • 如何实现chrome谷歌浏览器多开(独立环境 独立cookie)
    由于各种各样的原因,你可能需要在一个电脑登录某个平台,比如一个电脑登录3个公众号,或者3个知乎等等。最简单的方案是,直接安装3个不同的浏览器,比如一个谷歌浏览器,一个火狐浏......
  • cookie 使用
    目录使用使用defindex(request):#读cookie#is_login=request.COOKIES.get("is_login")is_login=request.get_signed_cookie("is_login",salt="12......