先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)

正文

随之WEB的发展,出现了网上商城之类购物网站,这类网站的一个需求是记住当前用户是谁,并且需要记住用户的登录状态(避免每次请求页面都重新登录)。

为了解决这个需求,出现了很多总解决办法。其中最有效的一个办法是:当用户第一次登录成功后,将用户的登录信息(用户名和密码)返回给用户的浏览器,让浏览器将登录信息保存在本地浏览器(cookie);之后用户再次访问该网站时,浏览器会携带之前保存的该网站的登录信息,这样服务端获取登录信息之后自动登录验证。

但是这种方式存在很大的安全隐患:容易泄露用户的登录信息;后来又出现了优化的解决办法。

新的解决办法是:当用户初次登录成功后,服务端会产生一个随机字符串,该字符串保存在服务端(session),保存成键值对的形式。同时将该字符串交由客户端浏览器保存。之后再访问服务端的时候,浏览器都会带着这个随机字符串,服务端去数据库中匹配是否又这个随机字符串对应的用户信息;匹配成功则自动登录。

其实,如果截获到该随机字符串,那么就可以冒充当前用户,其实还是有安全隐患的。所以应了那句话:在web领域没有绝对的安全也没有绝对的不安全。

这就是cookie和session的出现历程。

cookie

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

服务端保存在客户端浏览器的信息都可以称之为cookie,在客户端浏览器中cookie的表现形式一般都是key:value键值对的形式。在浏览器的调试模式中打开application就可以看见cookie。

django中操作cookie

django的视图函数的返回值一般有三种,分别是HttpResponse对象、render()、redirect(),本质上都是返回的HttpResponse对象,因此我们可以直接返回也可以现将对象用变量保存下来再返回,如果想要在django中操作cookie的话就必须利用中间变量。

不使用cookie

return HttpResponse() return render() return redirect()

使用cookie

obj = HttpResponse() 操作cookie return obj

如何设置cookie和获取cookie以及删除cookie呢?

当用户访问服务端时,为客户端浏览器设置cookie,客户端浏览器保存该cookie

obj.set_cookie(key, value)

当用户访问需要登录才能进入的页面时,服务端需要获取客户端浏览器携带的cookie,进行校验

obj.COOKIES.get(key)

删除用户浏览器上之前设置的usercookie值

obj.delete_cookie(key)

有一些网站每过一段时间就会让你重新登录,就是因为设置了cookie的过期时间,在django中也可以为cookie设置过期时间:

obj.set_cookie(key, value, max_age=3) obj.set_cookie(key, value, expires=3)

两个参数都是设置超时时间的,并且都是以秒为单位;需要注意的是,针对IE浏览器需要使用expires

cookie版登录和注销

需求大概就是使用cookie完成登录和注销的功能,并且通过装饰器实现不登录就无法使用除注册外的功能,未登录时访问功能页面直接跳转到登录页面,登录成功之后再访问想要访问的页面。

首先是登陆装饰器,装饰器可以放在项目根目录下的utils目录(自己创建)中。

utils/login_auth

from functools import wraps from django.shortcuts import redirect

def login_auth(func): @wraps(func) def inner(request, *args, **kwargs): target_url = request.get_full_path() # 获取用户想要访问的url if request.COOKIES.get(‘is_login’): res = func(request, *args, **kwargs) return res else: return redirect(f’/login/?next={target_url}') # 设置登录后跳转的页面url return inner

下面是视图函数:

views.py

from utils.login_auth import login_auth

登录页面

def login(request): info = {‘msg’:‘’}

获取用户上一次想要访问的页面

tag_url = request.GET.get(‘next’) if request.method == ‘POST’: username = request.POST.get(‘username’) password = request.POST.get(‘password’) if username == ‘python’ and password == ‘123’: if tag_url: obj = redirect(tag_url) else:

不能直接返回redirect,因为直接返回是无法保存cookie的,必须使用obj返回,才能记录状态,浏览器客户端才会保存

obj = redirect(‘/home/’)

max_age就是设置cookie的有效期,单位是秒,当达到了有效期后,浏览器客户端会自动删除本地的cookie信息

obj.set_cookie(‘is_login’, ‘this_user_has_been_logined’, max_age=10000) return obj else: info[‘msg’] = ‘帐号密码错误’

return render(request,‘login.html’,locals())

退出登录

@login_auth def logout(request): response_obj = redirect(‘login’) response_obj.delete_cookie(‘is_login’) return response_obj

主页

@auth def home(request):

return HttpResponse(‘我是home页面’)

session

Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取。因此就需要有一种新的东西,它能支持更多的字节,并且保存在服务器,有较高的安全性。这就是Session。

问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。

django中操作session

django中session的操作通过request对象下的session完成,它类似一个字典结构,操作方式和字典的操作非常类似。session中的数据是保存在服务端的数据库django_session表中,给客户端返回的是一个随机字符串,django默认session的过期时间是14天,可以认为修改它。django_session表中的数据条数是取决于浏览器的,同一个计算机上(IP地址)同一个浏览器只会有一条数据生效。主要是为了节省服务端数据库资源。

获取、设置、删除Session中数据

request.session[‘k1’] # 拿到’k1’对应的value request.session.get(‘k1’, None) request.session[‘k1’] = 123 request.session.setdefault(‘k1’,123) # 存在则不设置 del request.session[‘k1’]

所有 键、值、键值对

request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems()

会话session的key

request.session.session_key # 随机字符串ryl3jza580roxfntx8wittr0vykvmi5h

将所有Session失效日期小于当前日期的数据删除

request.session.clear_expired()

检查会话session的key在数据库中是否存在

request.session.exists(“session_key”)

删除当前会话的所有Session数据

request.session.delete() # 只删服务端的 客户端的不删 request.session.flush() # 浏览器和服务端都清空(推荐使用) 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。

设置会话Session和Cookie的超时时间

request.session.set_expiry(value)

如果value是个整数,session会在这些秒数后失效。如果value是个datatime或timedelta,session就会在这个时间后失效。如果value是0,用户关闭浏览器session就会失效。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试) [外链图片转存中…(img-YgdVE6tA-1713123392829)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。