Django Django Rest 使用用户名或邮箱登录的 JWT 登录

Django Django Rest 使用用户名或邮箱登录的 JWT 登录

在本文中,我们将介绍使用Django框架和Django Rest框架实现使用用户名或邮箱登录的JWT登录的方法。我们将使用Django的内置用户认证系统和Django Rest框架的功能来实现这一功能。我们将通过以下步骤来完成这个过程:

阅读更多:Django 教程

1. 创建Django项目和应用程序

首先,我们需要创建一个Django项目和一个应用程序。使用以下命令来创建Django项目:

django-admin startproject myproject

然后进入项目文件夹并创建一个应用程序:

cd myproject
python manage.py startapp myapp

2. 配置项目和应用程序

在你的项目中,需要进行一些配置以启用Django用户认证系统和Django Rest框架。首先,将myapp应用程序添加到settings.py文件的INSTALLED_APPS列表中。在文件的底部添加以下代码:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'myapp',
]

接下来,添加以下配置到settings.py文件的末尾,以启用Django Rest框架和其它相关配置:

# Django Rest Framework 配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ],
}

# JWT 配置
JWT_AUTH = {
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
}

3. 创建用户模型

默认情况下,Django提供了一个名为User的用户模型,用于处理用户认证。但是,这个模型只有用户名和密码字段。为了实现使用用户名或邮箱登录的功能,我们需要自定义用户模型。

首先,在myapp/models.py文件中导入Django提供的AbstractUser类,并创建一个自定义的用户模型。添加以下代码:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    email = models.EmailField(unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __str__(self):
        return self.email

然后,将这个新的用户模型应用到Django认证系统中。在myapp/admin.py文件中添加以下代码:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from myapp.models import User

admin.site.register(User, UserAdmin)

运行以下命令来迁移数据库并创建用户表:

python manage.py makemigrations
python manage.py migrate

4. 创建JWT登录终端点

现在,我们需要创建一个用于JWT登录的终端点。在myapp/views.py文件中,添加以下代码:

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    ...
    url(r'^api/token/$', obtain_jwt_token),
]

这将创建一个用于获取JWT令牌的终端点。现在,我们可以使用用户名或邮箱来进行登录。

示例代码

以下是一个示例代码,演示了如何使用Django和Django Rest框架实现使用用户名或邮箱登录的JWT登录功能:

# myapp/serializers.py
from rest_framework import serializers
from myapp.models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('email', 'password')

# myapp/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_jwt.settings import api_settings
from myapp.serializers import UserSerializer

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

class LoginView(APIView):
    def post(self, request):
        serializer_class = UserSerializer(data=request.data)
        serializer_class.is_valid(raise_exception=True)
        user = serializer_class.validated_data

        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)

        return Response({'token': token}, status=200)


# urls.py
from django.urls import path
from myapp.views import LoginView

urlpatterns = [
    ...
    path('api/login/', LoginView.as_view()),
]

总结

通过本文,我们学习了如何使用Django框架和Django Rest框架实现使用用户名或邮箱进行JWT登录的方法。我们通过创建自定义用户模型,配置Django Rest框架,并创建JWT登录终端点来实现这个功能。希望这篇文章能帮助你理解和实现这个功能。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程