当前位置: 首页 > news >正文

快速入手-基于Django-rest-framework的第三方认证插件(SimpleJWT)权限认证扩展返回用户等其他信息(十一)

1、修改serializer.py,增加自定义类

# 自定义用户登录token等返回信息

class MyTokenObtainPair(TokenObtainPairView):

    def post(self, request, *args, **kwargs):

        serializer = self.get_serializer(data=request.data)

        try:

            serializer.is_valid(raise_exception=True)

        except TokenError as e:

            raise InvalidToken(e.args[0])

        # 获取所有值

        result = serializer.validated_data

        result["email"] = serializer.user.email

        result["username"] = serializer.user.username

        result["id"] = serializer.user.id

        # 重写token名字

        result["token"] = result.pop("access")

        return Response(result, status=status.HTTP_200_OK)

完整代码:

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView

from .models import Link

from rest_framework import serializers, status
from rest_framework.response import Response
from rest_framework_simplejwt.exceptions import TokenError, InvalidToken
from rest_framework_simplejwt.views import TokenObtainPairView


# 和模型直接耦合,确定不灵活,上面的是自己写
class LinkSerializer(serializers.ModelSerializer):
    # 自定义接口字段名称source="name"是真实的,mingzi是解耦的名称
    mingzi = serializers.CharField(max_length=300, source="name")

    class Meta:
        # 指定关联哪个模型集
        model = Link
        # fields = "__all__"
        # 排除去掉哪些字段
        exclude = ["gid", "name"]


# 自定义用户登录token等返回信息
class MyTokenObtainPair(TokenObtainPairView):

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        try:
            serializer.is_valid(raise_exception=True)
        except TokenError as e:
            raise InvalidToken(e.args[0])

        # 获取所有值
        result = serializer.validated_data
        result["email"] = serializer.user.email
        result["username"] = serializer.user.username
        result["id"] = serializer.user.id
        # 重写token名字
        result["token"] = result.pop("access")
        return Response(result, status=status.HTTP_200_OK)

2、修改api模块中的urls.py

    # 登录

    # path("token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),

    path("token/", serializer.MyTokenObtainPair.as_view(), name="token_obtain_pair"),

完整代码

from django.urls import path, re_path
from . import views

from . import serializer

from rest_framework import routers
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenVerifyView,
    TokenBlacklistView,
)

routers = routers.DefaultRouter()
routers.register("linkapi", views.Linkapi)

app_name = "api"
urlpatterns = [
    # 登录
    # path("token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
    path("token/", serializer.MyTokenObtainPair.as_view(), name="token_obtain_pair"),
    # 刷新
    path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
    # 校验
    path("token/verify/", TokenVerifyView.as_view(), name="token_verify"),
    # 黑名单
    path("token/blacklist/", TokenBlacklistView.as_view(), name="token_blacklist"),
]

urlpatterns += routers.urls

3、基于上一节的代码,其他代码不变 

4、测试

 

 

相关文章:

  • 闭包与作用域的理解
  • Linux操作系统下离线安装nginx
  • 嵌入式学习第三十天--队列
  • 【区块链安全 | 第二十篇】类型之运算符
  • Docker 拉取镜像部分成功部分失败?
  • TDengine 核心概念与时序数据模型深度解析(二)
  • 从TRPO到GRPO
  • scikit-surprise 智能推荐模块使用说明
  • 简单视图函数
  • (BFS)题解:P9425 [蓝桥杯 2023 国 B] AB 路线
  • 智能打印预约系统:微信小程序+SSM框架实战项目
  • 机器学习的一百个概念(6)最小最大缩放
  • Codeforces Round #1014 (Div. 2)
  • 三路排序算法
  • 本科lw指导
  • 鸿蒙NEXT开发Base64工具类(ArkTs)
  • 消息队列--RocketMQ
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例13,TableView16_13 键盘辅助拖拽示例
  • 【算法】快速幂
  • 6内存泄露问题的讨论
  • 常州微信网站建设/360优化大师最新版下载
  • 西宁网站建设制作公司/考研最靠谱的培训机构
  • 烟台网站的建设/百度 营销怎么收费
  • 哪款地图可以看到实时街景/合肥seo公司
  • 合肥制作app的公司/纵横seo
  • 网站开发与维护工资/关于校园推广的软文