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. C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

    C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变 ...

  2. Uncaught TypeError: Cannot set property 'f7View' of undefined 错误原因

    // 添加视图var mainView = myApp.addView('.view-main', { // 因为我们要用动态的导航栏,我们需要使它的这一观点: dynamicNavbar: true ...

  3. RabbitMQ四:生产者--队列--消费者

    AMQP协议的梳理和名词解析  建议先把上篇AMQP协议先看一遍,理解一下,由于用XMind绘图,电脑屏幕比较小,不能截取全部,如果想要全图和源代码,请下面留言....... 可以点击图片,打开到新的 ...

  4. jmeter 连接 mysql 进行压力测试

  5. 让TortoiseGit记住帐号密码方法

    我的电脑环境是: Windows7 64x   系统用户名是:steden 所以,我的路径是:C:\Users\steden\ 具体要根据你的系统环境及当前用户名来决定. 在这里,有个文件:.gitc ...

  6. redis-3.0.1 sentinel 主从高可用 详细配置

    最近项目上线部署,要求redis作高可用,由于redis cluster还不是特别成熟,就选择了redis sentinel做高可用.redis本身有replication,实现主从备份.结合sent ...

  7. MFC_简易文件管理器

    练习_简易文件管理器 Edit1编辑框绑定变量,初始化内容 m_EditCtrl = L"D:\"; 添加List控件,属性设置report,OnInitDialog()函数里添加 ...

  8. 前端入门22-讲讲模块化 包括webstrom建立简单ES6

    https://www.cnblogs.com/dasusu/p/10105433.html

  9. eclipse如何设置多个字符的智能提示

    clipse代码里面的代码提示功能默认是关闭的,只有输入“.”的时候才会提示功能,用vs的用户可能不太习惯这种,vs是输入任何字母都会提示,下面说一下如何修改eclipse配置,开启代码自动提示功能打 ...

  10. ubuntulinux 更改时区设置时间

    Linux/shell命令的实际应用——查看并修改系统时区 命令: www.2cto.com date -R //查询当前系统时间与默认时区 cp /usr/share/zoneinfo/Asia/S ...