目录
"""
回忆: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的值证明没登录,直接跳转到登录页面
推导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
补充说明
1可以设置过期时间
2.存储session数据的位置也可以修改
标签:session,return,登录,get,request,seccion,cookie
From: https://www.cnblogs.com/zhanghong1229/p/16999641.html