JWT、Cookie、Session

Cookie

定义:是由服务器端生成,发送给浏览器,浏览器会将cookie中key/value保存到某个目录下的文本文件内,下次请求同一网站时将自动发送该cookie给浏览器

特点:

        1、是以键值队的格式存储数据的

        2、不同域名之间的cookie是不能互相访问的

        3、当浏览器请求某网站时,会将所关联的cookie发送给浏览器

Session

应用:对于一些相对于很敏感的信息,一般是由session保存在服务器端进行状态保持

Django项目默认开启session,如果不需要的话,可以再settings.py文件中删除session中间件

存储方式:

        1、存储在数据库中

        2、存储在缓存中

        3、混合存储

session基于cookie来实现

JWT:Token

分为三个部分

header #  头部:可加密可解密

payload #  载荷:可加密可解密

secret #  签证:头部+载荷+头部的加密方式+[只有后台知道的随机字符串,之可加密不可解密]

#  第一次:前端--(用户信息)--后端{1,验证,2,生成Token,3,返回}

#  第二次:前端--(缓存json)--后端{1,验证TOken,2,处理json,3,返回}

#   使用django自己的用户模块

1,建立model 继承:AbstractUser

from django.contrib.auth.models import AbstractUser

from django.db import models

from django.contrib.auth.models import AbstractUser

class JWTUser(AbstractUser):

    nickname = models.CharField(max_length=64)

    age = models.IntegerField()

#迁移报错:on database 'default',直接删除所有表后再次迁移即可

2,views中:

from rest_framework_jwt.settings import api_settings #生成token的包

# 使用JWT的注册接口

from rest_framework.views import APIView

from .Ser import *

from rest_framework.response import Response


class Users(APIView):

    permission_classes = [AllowAny] # 所有人都可以访问


    def post(self, request):

        data = request.data # 获取数据

        # 密码加密

        data1 = copy.deepcopy(data)

        old_pwd = data.get('password')

        new_pwd = make_password(old_pwd)

        data1['password'] = new_pwd

        # 存到数据库

        ser = UserSer(data=data1)

        if ser.is_valid():

            ser.save()

            user = JWTUser.objects.get(username=data1['username']) # 查询当前用户

            # 补充生成记录登录状态的token 生产token

            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER

            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            payload = jwt_payload_handler(user)

            token = jwt_encode_handler(payload)

            # 将token和数据库的信息进行返回

            response_data = ser.data

            response_data['token'] = token

            return Response({'code': 200, 'meg': '注册成功', 'data': response_data})

        else:

            print(ser.errors)

            return Response({'code': 400, 'meg': '注册失败'})

3,在settings中配置:

INSTALLED_APPS = [

    'rest_framework',

]

AUTH_USER_MODEL = 'Jwtapp.JWTUser' 指定项目和表

# 配置jwt验证

REST_FRAMEWORK = {

    # 身份认证

    'DEFAULT_AUTHENTICATION_CLASSES': (

        'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # JSONWebToken 认证模式

        'rest_framework.authentication.SessionAuthentication',

        'rest_framework.authentication.BasicAuthentication',

    ),

    # 全局配置JWT验证设置

    'DEFAULT_PERMISSION_CLASSES': (

        'rest_framework.permissions.IsAuthenticated',

    ),

}

import datetime

JWT_AUTH = {
    'JWT_AUTH_HEADER_PREFIX': 'JWT', # 声明方法

    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # 使用期限

    'JWT_RESPONSE_PAYLOAD_HANDLER':

    'Jwtapp.views.jwt_response_payload_handler', # 重新login登录返回函数

}

登录:

# 重新用户登录返回函数

def jwt_response_payload_handler(token, user=None, request=None):

'''

:param token: jwt生成的token值

:param user: User对象

:param request: 请求

'''

return {

'token': token,

'user': user.username,

'userid': user.id,

'nickname': user.nickname

}

urls:

from rest_framework_jwt.views import obtain_jwt_token #  登录时生产token

path('login/', obtain_jwt_token), #  登录接口

path('jwt/user/', Users.as_view()), #  注册接口

#permission_classes = [AllowAny] #  所有人都可以访问

#permission_classes = [IsAdminUser] #  登录了才可以访问

下载:#  pip install djangorestframework-jwt

#  Django 版本必须时2.2.2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值