JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae

DRF JWT 的使用方法:

1. 安装 DRF JWT

# pip install djangorestframework-jwt 

2. 配置

REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES":("rest_framework_jwt.authentication.JSONWebTokenAuthentication",) # 全局设置的方法,也可在单个视图中设置
}

3. 在 url 中添加相应路径

from rest_framework.authtoken import views
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [
re_path(r"^api-token-auth/",views.obtain_auth_token), # DRF 自带的 token 认证模式;需导入
re_path(r"^login/",obtain_jwt_token), # jwt的认证接口(路径可自定义任意命名)
]

4. 前端向 login/ 这个路径发送请求时可进行登陆验证;

5. 访问需要登陆认证后才能访问的url时,在请求头(Header)中添加 Authorization:JWT <your_token>  (Authorization 为 name,JWT <your_token> 为 value);登陆认证成功后,自动返回给前端一个 Token

6. 使用token访问被保护的url

# 设置某些view的权限(permission_classes)为permissions.IsAuthenticated,那么没有提供token而访问被保护的view是不被允许的.
# 你可以设置用户注册的权限为permissions.AllowAny,这样用户可以通过用户名和密码拿到token,在之后访问被保护的view时,将token作为身份凭证发送给服务端(rest-framework会自动验证token是否有效,如果在settings.py中做了准备中的配置的话)

7. JWT的额外设置(如过期时间)

# 在 settings 中
import datetime
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300), # 设置 JWT Token 的有效时间
'JWT_AUTH_HEADER_PREFIX': 'JWT', # 设置 请求头中的前缀
}

DRF JWT 文档:http://getblimp.github.io/django-rest-framework-jwt/

注:认证的作用是取出当前用户

自定制 jwt 的 Token

# 注册成功后如果想让前端自动登陆,则需要返回给前端一个 token;所以以下为手动生成一个 token 返回给前端
from rest_framework.mixins import CreateModelMixin
from rest_framework_jwt.serializers import jwt_payload_handler,jwt_encode_handler class UserViewset(CreateModelMixin, viewsets.GenericViewSet):
serializer_class = UserRegSerializer
queryset = User.objects.all() # 用户注册成功后,会在 User 表中生成一条记录;如果想要在生成 User记录的同时,生成一个 token ,则需要重构 CreateModelMixin 的 create() 方法
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = self.perform_create(serializer) # 在此处生成 token
res_dict = serializer.data
payload = jwt_payload_handler(user) # user 是 User 表中生成的一条新记录
res_dict["token"] = jwt_encode_handler(payload) # jwt_encode_handler(payload) 生成 token;并赋值给 res_dict["token"]
# res_dict 还可以根据需要添加其它内容 headers = self.get_success_headers(serializer.data)
return Response(res_dict, status=status.HTTP_201_CREATED, headers=headers) # 返回 res_dict def perform_create(self, serializer):
return serializer.save() # 把保存的 User 对象返回

自定义Django的认证类:

settings.py

# 自定义用户认证(如:手机号、邮箱登陆;Django的认证默认是只能通过用户名和密码认证)
AUTHENTICATION_BACKENDS = (
"apps.users.views.CustomBackend", # 路径.自定义认证类
)

views.py

from django.db.models import Q
from django.contrib.auth.backends import ModelBackend
from .models import UserInfo
# Create your views here. class CustomBackend(ModelBackend):
"""
自定义用户认证(如:手机号、邮箱登陆)
自定义用户认证时,需要把这个认证类放到 settings.py 中的 AUTHENTICATION_BACKENDS 中
"""
def authenticate(self, request, username=None, password=None, **kwargs): # authenticate() 这个函数中处理认证的逻辑
""" :param request:
:param username: 此时 username 可以是 用户名 或者 手机号
:param password:
:param kwargs:
:return:
"""
try:
user = UserInfo.objects.get(Q(username=username)|Q(mobile=username))
if user.check_password(password): # check_password() 时会转化为密文的形式
return user
except Exception as e:
return None

DRF 缓存:

django的缓存在DRF中不能直接用,而应该用封闭后的缓存,如:rest_framework_extensions

1. 安装 rest_framework_extensions

pip install drf-extensions

2. 配置 settings

REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_OBJECT_CACHE_KEY_FUNC':
'rest_framework_extensions.utils.default_object_cache_key_func', # retrieve 方法
'DEFAULT_LIST_CACHE_KEY_FUNC':
'rest_framework_extensions.utils.default_list_cache_key_func', # list 方法
}

3. 在视图中添加 缓存类 CacheResponseMixin

from rest_framework_extensions.cache.mixins import CacheResponseMixin

class GoodsViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,GenericViewSet): # 在对应视图中添加 CacheResponseMixin(添加到第一个位置)
"""
商品列表页,分页,过滤,搜索,排序
list:
所有商品列表
retrieve:
查看单个商品
"""
queryset = Goods.objects.all().order_by("pk")
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter) filter_class = GoodsFilter # 过滤
search_fields = ("name","goods_brief","goods_details") # 搜索
ordering_fields = ("sold_num","shop_price") # 排序 # 修改点击数
def retrieve(self, request, *args, **kwargs):
instance = self.get_object() # instance 是一个 Goods() 的对象
instance.click_num += 1 # 点击数 +1
instance.save()
serializer = self.get_serializer(instance)
return Response(serializer.data)

4. 设置超时时间

REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 15 # 表示15分钟
}

注: 该缓存默认使用的是 自带的 local memory cache(程序重启缓存即消失)

DRF JWT的用法 & Django的自定义认证类 & DRF 缓存的更多相关文章

  1. Django(62)自定义认证类

    前言 如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的 源码分析 源码的入口在APIView.py文件下的di ...

  2. 自定义user表签发token、自定义认证类、simpleui模块使用

    今日内容概要 自定义User表,签发token 自定义认证类 simpleui的使用 多方式登陆接口(后面也写 内容详细 1.自定义User表,签发token # 如果项目中的User表使用auth的 ...

  3. [py][mx]django自定义认证类-实现邮箱作为用户名登录

    创建自定义验证用户名密码类CustomBackend users/views.py from django.contrib.auth import authenticate, login from d ...

  4. django 实现自定义认证

    1.Django自带用户认证系统 Django自带用户认证系统,这个系统支持访问控制.注册用户.关联创建者和内容等:在开发用户认证功能时的时候,可以使用Django自带用户认证系统实现: A.相关表 ...

  5. The Django Book(自定义ModelAdmi类)

    默认的,管理界面下显示的东西只是 python2:def __unicode__(self): 和 python3:def __str__(self): 中返回的字段内容 想要让它更加的多元化的话 c ...

  6. DRF JWT认证(二)

    快速上手JWT签发token和认证,有这一篇就够了,DRF自带的和自定义的都帮你总结好了,拿去用~

  7. DRF内置认证组件之自定义认证系统

    自定义token认证 我们知道,在django项目中不管路由以及对应的视图类是如何写的,都会走到 dispatch 方法,进行路由分发, 在阅读 APIView类中的dispatch 方法的源码中,有 ...

  8. Django(63)drf权限源码分析与自定义权限

    前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...

  9. drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用

    三大认证工作原理简介 认证.权限.频率 源码分析: from rest_framework.views import APIView 源码分析入口: 内部的三大认证方法封装: 三大组件的原理分析: 权 ...

随机推荐

  1. 211 Add and Search Word - Data structure design 添加与搜索单词 - 数据结构设计

    设计一个支持以下两个操作的数据结构:void addWord(word)bool search(word)search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z . ...

  2. HDU 5996 博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=5996 博弈论待补. 这题变化了一下,因为注意到奇数层的东西(层数从1开始),对手可以模仿地动,那就相当于没动. ...

  3. [转]Azure 表存储和 Windows Azure SQL Database - 比较与对照

    本文转自:https://msdn.microsoft.com/library/azure/jj553018 更新时间: 2014年10月 作者:Valery Mizonov 和 Seth Manhe ...

  4. String的用法——转换功能

    package cn.itcast_05; /* String类的转换功能: byte[] getByte():把字符串转换成字节数组 复习: public String(byte[] bytes): ...

  5. AJPFX对equals()方法和==异同的比较

    equals()方法是Object类的方法,所有的类都集成了此方法,还有部分类重写了这个方法,我们看一下Object类中关于该方法的的源码: public boolean equals(Object ...

  6. vue组件、数据解析的实现思想猜想与实践

    Vue的全局组件,在注册后,可在全局范围内无限次使用,猜想是利用了闭包"可以保持形参"的特性,使初始化时的作用域得意保存,下面用原生js和部分jquery代码模拟了数据解析和组件渲 ...

  7. 触发器deleted 表和 inserted 表详解

    摘要:触发器语句中使用了两种特殊的表:deleted 表和 inserted 表. create trigger updateDeleteTimeon userfor updateasbegin  u ...

  8. AIX 10201 ASM RAC安装+升级到10204

    1:查看系统版本 [rac1:root:/hacmp/hacmp5.4/ha5.4/installp/ppc] oslevel -s 6100-06-06-1140 lslpp -al bos.adt ...

  9. 卸载钩子 UnhookWindowsHookEx

    The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindow ...

  10. Axis1.4框架 实现webservice服务器和客户端

    一:软件环境 win7旗舰版, Eclipse,JDK1.6,tomcat6.0,Axis1.4的包. 至于Axis1.4包网上可以下载,如果是在找不到可以留言给我. 二:摘要 将解压后的 axis- ...