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. hibernate 中createQuery与createSQLQuery(转载)

    息: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.miracle.dm.doc.catalog.mo ...

  2. Atcoder B - Boxes 玄学 + 数学

    http://agc010.contest.atcoder.jp/tasks/agc010_b 预处理出每两个相邻的数的差值,那么首先知道是一共取了sum / ((1 + n) * n / 2)次,因 ...

  3. hbase最近的一些实践

    有一段实践没有写东西了,最近组里面来了两个新的小伙伴,并且一起针对目前的hbase集群做了一些运维和优化实践,比较零散,记录下来供以后以及和大家参考. 1,hbase regionserver宕机导致 ...

  4. Spring @Resource、@Autowired、@Qualifier区别

    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualif ...

  5. dotnet cors 跨域问题

    研究了一整子的.net core框架,感觉挺好用的,可以用在实际项目中,前端avalon框架也在研究: 问题:跨域,相比原来的跨域解决方案,还是有不小的变化的,原来的.net api 只需要在WebA ...

  6. Node.js——事件与发布机制

  7. redis 可视化管理工具

    Redis Desktop Manager 下载地址:http://redisdesktop.com/download 支持: Windows 7+, Mac OS X 10.10+, Ubuntu ...

  8. 迅为i.MX6UL核心板ARMCortex-A7单核NXP飞思卡尔工控行业Imx6核心板

    iMX6UL核心板小巧精致,尺寸仅38mm*42mm:CPU型号iMX6UL@ 528MHz ARM Cortex-A7架构 :内存:512M DDR :存储:8G EMMC,低功耗,性能强大,性价比 ...

  9. OpenFlow_tutorial_2_Install_Required_Software

    一.Required Software 我操作系统用的 ubuntu 18.04.vm image的OS是ubuntu14.04,这两个系统的GUI应该已经不兼容了,如果使用ubuntu18.04的主 ...

  10. C# 如何发送Http请求

    HttpSender是一个用于发送Http消息的轻量C#库,使用非常简单,只需要一两行代码,就能完成Http请求的发送 使用 Nuget,搜索 HttpSender 就能找到这个库 这个库的命名空间是 ...