#前言:
该博客主要讲解了在Django中关于会话的一些知识以及操作,以及关于跨站点防御的内容,小编会继续尽力更新一些优质文章,欢迎大家点赞和收藏,也欢迎大家关注等待后续文章。
一、简介:
会话指的是浏览器和web服务器之间的通信。
HTTP 协议是无状态协议。web 服务器无法知道用户上一次会话的数据,用来维护用户在访问网站过程中的状态,会话控制是使用 Cookie 和 session 一起实现。
简单总结一下,会话说到底就是用于在客户端和服务器之间跟踪用户的状态。它允许您在用户访问您的网站时存储和检索数据,以便在用户的不同请求之间保持持久性。
而Cookie,它是面向浏览器的,也就是说当我们访问一个网站的时候,浏览器会记住我们的信息,以便下次验证。
Session,它是面向服务器的,Session会话客户端是查看不了的,只有服务端才可以进行查看。
二、Cookie会话:
在Cookie会话中,关于验证登录状态是其最为重要的一个点。
1、设置Cookie会话:
在视图文件中(views.py):
设置Cookie数据包括key,value,以及能在浏览器中保存的时间。(具体细节在代码注释中都有提及)。
python
def cookie_set(request):
# 设置 Cookie 数据,要响应到浏览器中
# 设置 Cookie 数据要使用 HttpResponse 对象或者其子类对象
response = HttpResponse("设置 Cookie 数据")
# set_cookie(key , value) , 设置 Cookie 数据不能是中文
# Cookie 数据在浏览器中保存的时间默认为 2 周
# max_age 设置过期时间,单位:秒
response.set_cookie('name', 'ac' , max_age=30)
response.set_cookie('age' , '28' , expires=datetime.datetime.now()+datetime.timedelta(days=3))
##获取当前时间并且加多少天
return response
2、获取Cookie值:
python
def cookie_get(request):
print(request.COOKIES)
data = request.COOKIES.get('name')
return HttpResponse(f'获取 Cookie 数据{data}')
3、删除Cookie值:
python
def cookie_del(request):
# 删除 Cookie 数据要使用 HttpResponse 对象或者其子类对象
response = HttpResponse('删除 Cookie 数据')
response.delete_cookie('age')
return response
4、用Cookie值验证登录:
下述代码包括这么几个操作:
首先我们创建了一个index.html的简单登陆页面
其次当我们响应登陆时若我们的信息在浏览器中可以正常访问,如若不在就返回登录状态。
当我们要响应一个页面,而浏览器没有我们的Cookie信息时,我们登录成功后依旧直接重定向到我们刚刚要访问的页面。
python
def index(request):
return render(request , 'index.html')
def login(request):
if request.method == 'GET':
return render(request , 'login.html')
name = request.POST.get('username')
password = request.POST.get('password')
if not all([name , password]):
return render(request , 'login.html' , {'error':'用户名或者密码错误'})
# 获取请求中的重定向的 url 的参数
url = request.GET.get("redirect_url")
# 判断是否有携带这个重定向的 url 参数
# 有,登录成功之后重定向到指定的 url 中
# 没有,默认重定向到首页
if url:
response = redirect(url)
else:
response = redirect('/index/')
response.set_cookie('data' , name)
return response
def cart(request):
# 获取浏览器请求中的 Cookie 数据
res = request.COOKIES.get('data')
# 判断是否有携带制定的键值对数据
if res:
return HttpResponse('购物车页面')
else:
# 浏览器中没有这份数据,需要进行登录
url = request.path
return redirect(f'/login/?redirect_url={url}')
def info(request):
# 获取浏览器请求中的 Cookie 数据
res = request.COOKIES.get('data')
# 判断是否有携带制定的键值对数据
if res:
return HttpResponse('个人信息页面')
else:
# 浏览器中没有这份数据,需要进行登录
url = request.path
return redirect(f'/login/?redirect_url={url}')
若是我们面对繁琐很多页面时候,还要进行上述操作就可以用解释器来将它重定向了:
python
def wap(func):
def inner(request , *args , **kwargs):
# 获取浏览器请求中的 Cookie 数据
res = request.COOKIES.get('data')
# 判断是否有携带制定的键值对数据
if res:
# 返回对应试图函数
return func(request)
else:
# 浏览器中没有这份数据,需要进行登录
url = request.path
return redirect(f'/login/?redirect_url={url}')
return inner
@wap
def cart(request):
return HttpResponse('购物车页面')
@wap
def info(request):
return HttpResponse('个人信息页面')
5、Cookie会话大小范围:
Cookie 保持数据大小是有限制的,最大保存 4 KB;
一个服务器醉倒在浏览器上保存 20 个 Cookie 数据;
一个浏览器 最多保存 300 个 Cookie。
三、Session会话:
Session 跟 Cookie 不同的是 Session 数据保存在服务端中.
当浏览器第一次请求服务端的时候,服务端会生成一个 Session 的 id 编号给浏览器,是以 Cookie 形式发给浏览器,后续浏览器继续发送请求的时候,都会携带这个 id 进行访问。
Session 也是键值对的方式保存用户数据,Session 在服务端会给每一个用户创建 Session 对象,对象的 id 值是保存在数据库中。
1、设置Session会话:
在视图文件中(views.py):
python
def session_set(request):
# 设置 Session 数据 , 通过 request 进行设置
# 保存 Session 数据之后 , 会自动保存到数据库:django_session 表中
request.session['name'] = '阿宸'
request.session['age'] = '27'
# 设置过期时间,单位:秒
request.session.set_expiry(60)
return HttpResponse('设置 Session 数据')
2、获取Session值:
python
def session_get(request):
res = request.session.get('name')
return HttpResponse(f'获取 Session 数据{res}')
3、删除Session值:
python
def session_del(request):
# 清除过期的 Session 数据
# request.session.clear_expired()
# 删除某一个数据
# del request.session['name']
# 清空所有的数据
request.session.flush()
return HttpResponse('ok')
4、Session会话大小范围:
Session数据的大小通常受到服务器和浏览器的限制,因此受服务器存储的可用空间限制。
四、跨站点防御:
CSRF:跨站点伪造请求
CSRF指攻击者盗用你的身份或者以你的名义发送恶意请求(盗取你的账号,购买商品,窃取你的个人信息)
防止 CSRF 的攻击, Django 在中间件中作了 CSRF 的防御机制。
浏览器第一次访问 服务端的时候 , Django 会自动随机生成 token 数据以 Cookie 形式发送给浏览器 。当浏览器发送请i去的时候会携带这份数据到服务端中。这个中间件防御只对 post 请求有效 , get 请求无效。
当浏览器发送了 post 请求的时候,服务端会自动的进行检查 token 是否和保存的一致。用这种方式避免 CSRF。
五、总结:
该篇博客主要讲解了关于Django中会话的一些操作(Cookie和Session会话),和跨站点防御的一些基本知识。小编后续还会继续更新内容,欢迎各位大佬的指导,也欢迎各位关注我坐等后续,您的支持是我变强的最大动力!!