首页 > 其他分享 >cookie和session

cookie和session

时间:2022-12-26 23:55:24浏览次数:39  
标签:return request session cookie obj login

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

相关文章