[DRF]入门-6 : drf用户系统,自定义用户类,并完成drf的view方式进行登录,并使用token

# 初始搭建开发环境
mkdir drf_learn6
cd drf_learn6/
virtualenv venv
source venv/bin/activate
pip install --upgrade pip
pip install django
pip install djangorestframework
pip install drf-yasg
pip freeze > requirements.txt
django-admin startproject myproject .
python manage.py startapp myapp
echo "success"

# 创建数据库并测试
python manage.py makemigrations
python manage.py makemigrations myapp
python manage.py migrate
python manage.py runserver

# 创建用户的代码
python manage.py createsuperuser --username=joe --email=[email protected]
## 密码123456

具体步骤

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework.authtoken',
    "myapp",
]

AUTH_USER_MODEL = 'myapp.user'

在这里插入图片描述

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class user(AbstractUser):
    fuckid = models.CharField(max_length=30)

views.py

from django.contrib.auth import authenticate
from django.shortcuts import render
from rest_framework import authentication, permissions
from rest_framework.authtoken.models import Token
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import permission_classes

from myapp.models import user


class userViews(APIView):
    """
    View to list all users in the system.

    * Requires token authentication.
    * Only admin users are able to access this view.
    """

    authentication_classes = [
        authentication.TokenAuthentication,
    ]

    def post(self, request, format=None):
        """
        login
        """  
        username = request.POST["username"]
        password = request.POST["password"]
        m_user = authenticate(request, username=username, password=password)
        m_user2 = user.objects.filter(id=1)
        print("user1 = {} : user2 = {}".format(m_user, m_user2[0]))

        if user is not None:
            token, created = Token.objects.get_or_create(user=m_user2[0  ])
            return Response("Authorization: Token {}".format(token.key))
        else: 
            # Return an 'invalid login' error message.
            return Response("fail")
      
    def get(self, request, format=None):
        """
        get user info
        """
        return Response("当前用户 : {}".format(request.user.username))

    # @permission_classes([permissions.IsAuthenticated])
    def delete(self, request, format=None):
        """
        logout
        """
        username = request.user.username
        Token.objects.filter(user=request.user).delete()
        return Response("已经登出用户 : {}".format(username))

urls.py

"""myproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from myapp.views import userViews
from rest_framework.authtoken import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("user/", userViews.as_view(), name="user"),
    path("api-token-auth/", views.obtain_auth_token),
]

在这里插入图片描述

测试

1. 得到当前用户(无用户)

在这里插入图片描述

2. 登录用户(登录成功)在这里插入图片描述

3. 得到当前用户(当前用户信息)

在这里插入图片描述

4. 登出用户(登出成功)

在这里插入图片描述

5. 得到当前用户(无用户信息)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/JianShengShuaiest/article/details/127255409
DRF