You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django登录与令牌获取功能测试实现方法咨询

Django登录功能测试代码实现

核心测试流程

测试主要覆盖三个关键环节:

  • 发起登录请求并验证令牌获取
  • 携带合法令牌访问受保护视图
  • 验证未授权状态下的访问限制

代码实现(以JWT认证为例)

假设你的项目采用JWT令牌认证,登录接口为/api/login/,受保护视图包括/api/profile/和/api/dashboard/:

from django.test import TestCase
from django.contrib.auth.models import User
from rest_framework.test import APIClient
from rest_framework import status

class LoginFlowTests(TestCase):
    def setUp(self):
        # 初始化测试环境
        self.client = APIClient()
        # 创建测试用户
        self.test_user = User.objects.create_user(
            username='test_user',
            password='test_pass_123',
            email='test@example.com'
        )
        # 定义接口路径
        self.login_endpoint = '/api/login/'
        self.profile_endpoint = '/api/profile/'
        self.dashboard_endpoint = '/api/dashboard/'

    def test_full_login_and_protected_access(self):
        # 1. 发起登录请求获取令牌
        login_payload = {
            'username': 'test_user',
            'password': 'test_pass_123'
        }
        login_response = self.client.post(self.login_endpoint, login_payload, format='json')
        
        # 验证登录成功并拿到令牌
        self.assertEqual(login_response.status_code, status.HTTP_200_OK)
        self.assertIn('token', login_response.data)
        auth_token = login_response.data['token']

        # 2. 携带令牌访问个人资料视图
        self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {auth_token}')
        profile_response = self.client.get(self.profile_endpoint)
        self.assertEqual(profile_response.status_code, status.HTTP_200_OK)
        self.assertEqual(profile_response.data['username'], 'test_user')

        # 3. 携带令牌访问仪表盘视图
        dashboard_response = self.client.get(self.dashboard_endpoint)
        self.assertEqual(dashboard_response.status_code, status.HTTP_200_OK)

    def test_unauthorized_access_blocked(self):
        # 未携带令牌直接访问受保护视图,验证返回401
        profile_response = self.client.get(self.profile_endpoint)
        self.assertEqual(profile_response.status_code, status.HTTP_401_UNAUTHORIZED)

        dashboard_response = self.client.get(self.dashboard_endpoint)
        self.assertEqual(dashboard_response.status_code, status.HTTP_401_UNAUTHORIZED)

适配Session认证的测试写法

如果你的项目用Django原生Session认证,只需调整登录和验证逻辑:

def test_session_based_login_flow(self):
    # 发起表单登录请求
    login_payload = {
        'username': 'test_user',
        'password': 'test_pass_123'
    }
    login_response = self.client.post('/accounts/login/', login_payload)
    
    # 验证登录成功(通常会重定向)
    self.assertEqual(login_response.status_code, status.HTTP_302_FOUND)
    
    # 访问受保护视图
    profile_response = self.client.get('/accounts/profile/')
    self.assertEqual(profile_response.status_code, status.HTTP_200_OK)

关键说明

  • setUp方法:提前初始化测试用户和客户端,避免重复代码
  • client.credentials():为请求头添加认证令牌,模拟已登录状态
  • 核心验证点:登录状态码、令牌存在性、受保护视图的权限控制、未授权拦截逻辑

内容的提问来源于stack exchange,提问作者kokorodo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:35:17