码迷,mamicode.com
首页 > 其他好文 > 详细

用户模块+jwt实现+注册带token值+自动生成用户名

时间:2021-01-29 11:42:00      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:elf   前缀   The   ash   用户信息   base   ade   render   gap   

1.1 settings.py

# jwt载荷中的有效期设置
JWT_AUTH = {
    # 1.token前缀:headers中 Authorization 值的前缀
    ‘JWT_AUTH_HEADER_PREFIX‘: ‘JWT‘,
    # 2.token有效期:一天有效
    ‘JWT_EXPIRATION_DELTA‘: datetime.timedelta(days=1),
    # 3.刷新token:允许使用旧的token换新token
    ‘JWT_ALLOW_REFRESH‘: True,
    # 4.token有效期:token在24小时内过期, 可续期token
    ‘JWT_REFRESH_EXPIRATION_DELTA‘: datetime.timedelta(hours=24),
    # 5.自定义JWT载荷信息:自定义返回格式,需要手工创建
    ‘JWT_RESPONSE_PAYLOAD_HANDLER‘: ‘user.utils.jwt_response_payload_handler‘,
}

1.2 user/utils.py

# -*- coding: utf-8 -*-
def jwt_response_payload_handler(token, user=None, request=None, role=None):
    """
        自定义jwt认证成功返回数据
        :token 返回的jwt
        :user 当前登录的用户信息[对象]
        :request 当前本次客户端提交过来的数据
        :role 角色
    """
    if user.first_name:
        name = user.first_name
    else:
        name = user.username
        return {
            ‘authenticated‘: ‘true‘,
             ‘id‘: user.id,
             "role": role,
             ‘name‘: name,
             ‘username‘: user.username,
             ‘email‘: user.email,
             ‘token‘: token,
        }

1.3 user/views.py

import datetime
import random

from django.contrib.auth.hashers import make_password
from django.shortcuts import render

# Create your views here.
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.views import APIView

from user.models import User
from user.serializers import UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer



class RegisterView(APIView):
    def post(self, request):
        username = request.data.get(‘username‘)
        password = request.data.get(‘password‘)
        password_new = request.data.get(‘password_new‘)
        if not all([username, password, password_new]):
            return Response(
                {‘msg‘: ‘信息不全‘, ‘code‘: 400}
            )
        if password != password_new:
            return Response(
                {‘code‘: 400, ‘msg‘:‘两次登录密码不一致‘}
            )
        user_serializer = UserSerializer(data=request.data)
        if user_serializer.is_valid():
            user_serializer.save()
            user_info = User.objects.filter(username=username).first()
            return Response(
                {‘msg‘: ‘注册成功‘, ‘code‘: 200, ‘token‘: user_info.token}
            )
        return Response(
            {‘msg‘: ‘注册失败‘, ‘error‘: user_serializer.errors }
        )

1.4 user/serializers.py

# -*- coding: utf-8 -*-
from rest_framework import serializers
from rest_framework_jwt.serializers import jwt_payload_handler
from rest_framework_jwt.settings import api_settings

from user.models import User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ‘__all__‘

    def create(self, data):
        username = data.get(‘username‘, ‘‘)
        password = data.get(‘password‘, ‘‘)
        mobile = data.get(‘mobile‘, ‘‘)
        email = data.get(‘email‘, ‘‘)
        user = User(username=username, email=email, mobile=mobile)
        user.set_password(password)
        user.save()

        # 补充生成记录登录状态的token
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        print(token)
        user.token = token
        user.save()
        return user

1.5 user/urls.py

# -*- coding: utf-8 -*-

from django.urls import path
from rest_framework.routers import DefaultRouter
from rest_framework_jwt.views import obtain_jwt_token

from user import views

router = DefaultRouter()
router.register(r‘user‘, views.UserViewSet)

urlpatterns = [
    path(‘login/‘, obtain_jwt_token),
    path(‘register/‘, views.RegisterView.as_view()),
]

urlpatterns += router.urls

1.6 user/views.py

# -*- coding: utf-8 -*-

#重写注册接口
class RegApiView(APIView):


    def post(self,request):

        uname = request.data.get(‘uname‘)
        password = request.data.get(‘password‘)
        # email = request.data.get(‘email‘)

        if all([uname,password]):
            pass
        else:
            return Response({‘参数没填完‘})

        rand_name = self.randomUsername()
        print(rand_name)
        user = User(username=rand_name,uname=uname)
        user.password = make_password(password)
        user.save()

        return Response({‘去看看库里成功没有‘})

    def randomUsername(self):
        """
        生成随机用户名: 格式: SYL + 年月日时分 + 5位随机数
        :return:
        """
        d = datetime.datetime.now()
        base = ‘SYL‘
        time_str = ‘%04d%02d%02d%02d%02d‘ % (d.year, d.month, d.day, d.hour,d.minute)
        rand_num = str(random.randint(10000, 99999))
        return base + time_str + rand_num

用户模块+jwt实现+注册带token值+自动生成用户名

标签:elf   前缀   The   ash   用户信息   base   ade   render   gap   

原文地址:https://www.cnblogs.com/lzhpython/p/14253486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!