使用axios请求登录到Django rest_framework_simplejwt生成token并返回
简介
在现代的Web应用程序中,用户认证和授权是非常重要的功能。Django是一个流行的Python Web框架,而Django rest_framework_simplejwt是一个用于Django的简单JSON Web Token(JWT)身份验证插件。本文将向您展示如何使用axios库从前端发送登录请求到Django服务器,并使用rest_framework_simplejwt生成和返回JWT令牌。
状态图
stateDiagram
[*] --> 登录
登录 --> 生成令牌
生成令牌 --> 返回令牌
返回令牌 --> [*]
准备工作
在开始之前,需要确保您已经安装了以下组件:
- Django:用于构建Web应用程序的Python Web框架。
- django-rest-framework:用于构建RESTful API的Django扩展。
- djangorestframework-simplejwt:用于生成和验证JSON Web Token的Django扩展。
- axios:用于发送HTTP请求的JavaScript库。
您可以使用以下命令安装这些组件:
pip install Django
pip install djangorestframework
pip install djangorestframework_simplejwt
在您的Django项目中,确保已经进行了以下配置:
- 在Django的settings.py文件中,将'rest_framework'和'rest_framework_simplejwt'添加到INSTALLED_APPS。
- 在settings.py文件中,将rest_framework的认证类设置为rest_framework_simplejwt的Token认证类。
- 在urls.py文件中,将rest_framework的路由添加到Django项目中。
编写前端代码
首先,我们将编写前端代码,使用axios发送登录请求到Django服务器。在您的HTML文件中,添加以下代码:
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<script src="
</head>
<body>
Login
<form id="login-form">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<button type="submit">Login</button>
</form>
<script>
const form = document.getElementById('login-form');
form.addEventListener('submit', function(event) {
event.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
axios.post('http://localhost:8000/api/token/', {
username: username,
password: password
}).then(function(response) {
const token = response.data.access;
// 在这里可以将令牌保存到本地存储或cookie中
console.log('Token:', token);
}).catch(function(error) {
console.error('Login failed:', error);
});
});
</script>
</body>
</html>
在上面的代码中,我们创建了一个简单的登录表单,其中包含用户名和密码字段。当用户提交表单时,我们使用axios发送POST请求到Django服务器上的'/api/token/'端点。请求的正文包含用户名和密码。成功的响应将包含一个名为"access"的属性,其中包含生成的JWT令牌。
编写后端代码
接下来,我们将编写Django的后端代码以处理登录请求并生成JWT令牌。在您的Django项目的views.py文件中,添加以下代码:
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
上面的代码创建了一个自定义的TokenObtainPairView视图类,并设置了其serializer_class属性为自定义的序列化器。
然后,创建一个名为serializers.py的文件,并添加以下代码:
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
# 在这里可以自定义响应数据
return data
上面的代码创建了一个自定义的TokenObtainPairSerializer序列化器类,并重写了validate方法以自定义响应数据。
在您的Django项目的urls.py文件中,添加以下代码:
from django.urls import path
from .views import MyTokenObtain