Django REST framework 的JWT Token获取用户信息

接口需求:用户登录成功后,返回Django REST framework 的JWT Token, Token不存储敏感信息,只有用户名,前端请求拦截中向后台发送token 返回用户的信息,前端通过读取用户信息中的角色来显示对应的值。

JS 前端API

export function getInfo(token) {
  return request({
    url: '/user/info',
    method: 'get',
    params: { token }
  })
}

要求后端返回的数据

{
    "data": {
        "id": 4,
        "username": "test1",
        "name": null,
        "role": "员工",
        "avatar": "https://upload.jianshu.io/users/upload_avatars/7294431/fc4cbf7e-d772-45d3-b909-0588a50ecc49.jpg"
    },
    "code": 20000,
    "message": "请求成功"
}

思路:发送token,获取token,解码token,查询用户信息,返回数据

1.Model设计,扩展Django自带的用户字段


from django.db import models
#引入系统用户的分类
from django.contrib.auth.models import AbstractUser

# Create your models here.

#userProfile继承AbstractUser分类,进行拓展
class UserProfile(AbstractUser):
    """
    用户类拓展
    """
    name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名" )
    avatar = models.CharField(max_length=100, null=True, blank=True, verbose_name="头像")
    role = models.CharField(max_length=10, default="员工", verbose_name="角色")


    class Meta:
        verbose_name = "用户"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username


2.setting设置

#将拓展的User替换系统默认的auth_user 模型
AUTH_USER_MODEL = "users.UserProfile"
image.png

3.运行,然后信息用户

makemigrations
migrate

4.编写序列化文件serializers,新建serializers.py


# -*- coding: UTF-8 -*-
from django.contrib.auth import get_user_model

from rest_framework import serializers

from rest_framework.validators import UniqueValidator


User = get_user_model()

class UserRegisterSerializer(serializers.ModelSerializer):
    # 利用drf中的validators验证username是否唯一
    username = serializers.CharField(required=True, allow_blank=False, validators=[UniqueValidator(queryset=User.objects.all(),
                                                                                        message='用户已经存在')])
    print(username)
    password = serializers.CharField(
         style={"input_type": "password"},help_text="密码", label="密码", write_only=True,
     )
    print(password, "password")

    def create(self, validated_data):
         user = super(UserRegisterSerializer, self).create(validated_data= validated_data)
         user.set_password(validated_data["password"])
         user.save()
         return user
    class Meta:
         model = User
         fields = ( "username", "password", "role", "avatar")



class UserDetailSerializer(serializers.ModelSerializer):
    """
    用户详情序列表类
    """
    class Meta:
        model = User
        fields = ("id", "username", "name", "role", "avatar")
image.png

5.View编写

from django.http import HttpResponse,JsonResponse
from rest_framework_jwt.utils import jwt_decode_handler
from django.contrib.auth import get_user_model
from users.serializers import UserDetailSerializer

def get_user_info(request):

    User = get_user_model()
    if request.method=='GET':
        #获取请求参数token的值
        token=request.GET.get('token')
        #顶一个空数组来接收token解析后的值
        toke_user = []
        toke_user = jwt_decode_handler(token)
        #获得user_id
        user_id = toke_user["user_id"]
        #通过user_id查询用户信息
        user_info = User.objects.get(pk= user_id)
        serializer = UserDetailSerializer(user_info)
        data = {

            "data": serializer.data,
            "code": 20000,
            "message": "请求成功"
        }

        return JsonResponse(data)
image.png

URL配置

from django.conf.urls import url, include
from apps import users
from django.contrib import admin
from django.urls import path, re_path
from rest_framework_jwt.views import obtain_jwt_token
from apps.users.views import UserViewset
from rest_framework.routers import DefaultRouter
from rest_framework.documentation import include_docs_urls
from rest_framework_swagger.views import get_swagger_view
from users import views
from users import base_views

router = DefaultRouter()
router.register(r'api/users', UserViewset, base_name="users")
schema_view = get_swagger_view(title='ShopVue API文档 ')


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/user/login', obtain_jwt_token),
    url(r'^', include(router.urls)),
    path('apidoc/', schema_view),
    path('docs/', include_docs_urls(title='ShopVue 文档')),
    re_path('api/user/info/$', base_views.get_user_info),
]

Postman请求结果
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容