cookie和session简介
http协议中规定了浏览器不会保存客户端的状态,无状态特性。
但是我们有时候需要保存用户的登录状态,不然用户每次访问都需要再次登录,所以有了用户校验用户是否登录的令牌
cookie:保存在客户端的用户状态相关信息
session:保存在服务端的用户状态相关的信息
session的工作主要依赖于cookie,浏览器必须允许保存cookie
django操作cookie
如何在用户登录成功是添加cookie
关键字 set_cookie('自定义名字',‘数据 ’)
COOKIES属性中添加键值对,就可以将cookie保存在客户端的浏览器中了。
后端:
# 用户登录
def login_func(request):
if request.method == 'POST': # 提交表单打算登录
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'moon' and password == '123':
# 校验密码成功的话
obj = redirect('/home/')
# 重定向到比如说首页,但是不直接return 用变量名接收
obj.set_cookie('name', username)
# return前添加设置cookie属
return obj
# 最后return 这样会直接把cookie发送到前端
# 登录成功 则 发送一个cookie到前端
return render(request, 'loginPage.html') # get请求拿登录界面
校验cookie
如何判断用户是否登录
可以检验是否有cookie的方式
request.COOKIES.get('name')
对cookies进行去值,如果有值则代表已登录
def login_auth(func):
def inner(request, *args, **kwargs):
# 视图函数一定含request参数,所以单独先接收便于操作
target_path = request.path_info
# 拿到请求的路由
if request.COOKIES.get('name'):
# 校验用户态
res = func(request, *args, **kwargs)
return res
return redirect(f'/login/?next={target_path}')
# 将被装饰的视图函数的路由发送给login函数
return inner
删除cookie
obj = redirect('/home/')
obj.delete_cookie(key)
return obj
这样就相当于注销用户的功能
django操作session
如果只通过cookie来判断是否已登录 不严谨,应该搭配session来校验
-
session是存在数据库的表中,django默认执行迁移命令后就会产生一张django_session表存储。
-
session默认存储的结构是三个字段,分别是session键、session值和过期时间。
-
过期时间expire_data的默认间隔是两周。
-
校验用户态就是将随机生成的session键交给用户的cookie,将用户信息如用户名存到session值中。当用户再带着cookie过来时,就将cookie的值和表中所有session键比对,如果有对应的session键,就对应的拿到保存着对应用户态的session值。
如何设置session
当用户登录成功时
request.session['key'] = value
# value为我想存到session_data字段的值,会自动加密
# 并且在django_session表中储存该信息 已密文方式储存
# 前端看到的也是密文
如何校验session
当校验用户是否登录时
request.session.get('key', None)
# 拿到cookie中的session字符串(键key要与设置的相对应)
# 会自动把密文的session解密展示
如何设置session过期时间
默认不做任何设置时 2周过期
request.session.set_expiry(60) # 数字单位秒
如何设置为0 那用户只要关闭浏览器后就会自动失效
案例:登录
session版本的用户登录功能
校验是否登录装饰器
登录成功自动跳转至想要前往的页面
用户输入标签设置
class Login(forms.Form):
username = forms.CharField(max_length=8, min_length=2,
error_messages={
'max_length': "最高8位数",
'min_length': "最低2位数",
} )
password = forms.CharField(max_length=16, min_length=6,
widget=forms.widgets.PasswordInput(),)
# 设置输入框属性 为 password
# 全局钩子
def clean(self):
username = self.cleaned_data.get('username')
# 在已完成初步校验的数据中获取用户输入的用户名
password = self.cleaned_data.get('password')
user_obj = models.User.objects.filter(username=username).first()
# 获取用户对象 用来判断账户是否存在 密码是否正确
if not user_obj:
self.add_error('username', '用户名不存在')
elif not user_obj.password == password:
self.add_error('password', '密码不正确')
return self.cleaned_data
def login(request):
login_obj = Login()
# 生成空的forms对象给前端 前端可以自动生成标签
if request.method == 'POST':
login_obj = Login(request.POST)
if login_obj.is_valid():
# 判断数据是否都已经通过校验
if not request.GET.get('next'):
# 判断是否用户时通过其他页面跳转来了 如果没有则默认跳转首页
obj = redirect('/home/')
# 如果不是通过装饰器重定向来的,就重定向到首页
else:
obj = redirect(request.GET.get("next"))
# 有next就重定向到原本的网页
request.session['key'] = login_obj.cleaned_data.get('username')
#登录成功 添加session 给到前端 设置key与值
# obj.set_cookie('name', username)
# 这里也可以设置cookie 给到前端
return obj
return render(request, 'loginPage.html', locals())
# get请求拿登录界面
校验是否登录装饰器
def login_auth(func):
def inner(request, *args, **kwargs):
# 视图函数一定含request参数,所以单独先接收便于操作
target_path = request.path_info
# 拿到用户是想访问哪个路由地址
username = request.session.get('key')
# 查看用户是否有session或者cookie
# username = request.COOKIES.get('name')
if username:
# 如果有session或者cookie 则正常执行接下来的路由函数
res = func(request, *args, **kwargs)
return res
return redirect(f'/login/?next={target_path}')
# 如果没有session或者cookie 则返回到login页面 并携带是从哪个页面被返回到login的
# 将被装饰的视图函数的路由发送给login函数
return inner
@login_auth
def home(request):
return HttpResponse('home页')
标签:return,request,session,cookie,obj,login
From: https://www.cnblogs.com/moongodnnn/p/17007162.html