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