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登录终端点来实现这个功能。希望这篇文章能帮助你理解和实现这个功能。
极客笔记