如何在Django Rest框架中通过用户令牌进行API测试?

时间:2019-06-13 14:02:47

标签: django django-rest-framework django-testing

我正在编写一些测试来检查与我的API的连接。

我已经通过令牌进行了身份识别,并且成功通过以下方式为特定的测试用户检索了令牌:

token = Token.objects.get(user__username='testuser')

我正在努力的是使用该令牌创建一个成功的API请求:

client = APIClient(HTTP_AUTHORIZATION='Token ' + token.key)
response = client.get('/patientFull/1/',headers={'Authorization': 'Token ' + token.key})

我一直在寻找许多方法来完成这项工作,而这些是我试图做到的一些方法:

response = requests.get('http://127.0.0.1:8000/patientFull/1/',headers={'Authorization': 'Token ' + token.key} )


client = APIClient()
client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
response = client.get('/patientFull/1/')

该测试是一个简单的断言,用于检查响应是否具有来自服务器的200 OK HTTP答案。

以上所有这些方式均会返回403 HTTP响应。

这是我的测试的完整代码(我正在使用夹具用测试数据填充我的测试数据库):

import json
import requests
from rest_framework.authtoken.models import Token
from rest_framework.test import APIRequestFactory, APITestCase, APIClient


class CustomerAPITestBack(APITestCase):
    fixtures = ['new-fixtures.json']

    def testDE(self):
        token = Token.objects.get(user__username='jpmichel')
        client = APIClient(HTTP_AUTHORIZATION='Token ' + token.key)
        response = client.get('/patientFull/1/',headers={'Authorization': 'Token ' + token.key})
        self.assertEqual(200, response.status_code)

我已经将我的settings.py文件配置为令牌:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'PHCAdmin.authentication.tokenAuthentication.ExpiringTokenAuthentication',
    ),
    'EXCEPTION_HANDLER': 'PHCAdmin.functions.pxlth_exception_handler',
}

REST_FRAMEWORK_EXPIRY_TIME = 12 # in hours
REST_FRAMEWORK_PASSWORD_RENEWALS = 90 # in days

如果我禁用了令牌身份验证,则此测试通过(GET返回200 OK)

我应该如何执行GET请求,以便它使用令牌将其标识为有效用户并返回200 OK HTTP响应?

2 个答案:

答案 0 :(得分:0)

只需结束这个问题: 经过一番研究,我发现服务器上的令牌与本地计算机上的令牌不同,我只需要更新双方的令牌即可。 上面的代码可以正常工作。

答案 1 :(得分:0)

我来这里是为了寻找答案,以解决使用令牌时force_authenticate无法正常工作的问题。对于相同情况的用户,您需要以这种方式同时指定用户和令牌:

client = APIClient()
client.force_authenticate(user=UserInstance, token=UserInstanceToken)