Django Rest APIClient类是否提出实际请求?

时间:2014-10-06 21:04:45

标签: django django-rest-framework django-sessions

我想知道请求是否实际上是通过http发出的。在我的应用程序中,我有一个看起来像

的测试
class Authenticate(APITestCase):

    def setUp(self):
        self.client = APIClient()
        self.password_for_admin = '123456'
        self.admin = User.objects.create_superuser(username='myname', email='email@email.com', password='123456')
        self.token = Token.objects.create(user=self.admin)

    def test_authenticate(self):
        """ comment """
        self.client.credentials(HTTP_AUTHORIZATION='Basic ' + base64.b64encode('{}:{}'.format(self.admin.username, self.password_for_admin)))
        response = self.client.post('/api/authenticate/')
        print response

在我看来,我有:

@api_view(('POST',))
def authenticate(request, format=None):
    """ comment """
    import pprint
    log.debug(pprint.pprint(request))

    try:
        "asdlfjl"
    except Exception, e:
        response = "An error occurred, {}".format(e)
    return Response(response)

我的设置如下:

INSTALLED_APPS = (
    ...
    'django.contrib.sessions',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
)

请求在我的日志文件中打印为None。我需要参加会议。我试过request.session(这是None),这就是我引发这个问题的原因。

1 个答案:

答案 0 :(得分:1)

我明白了。服务器确实使用testserver域发送请求。这是一个误导性问题,代码错了。用户在到达此视图方法时已使用其余基本后端进行了身份验证。

通过大量研究我发现用户正在通过休息进行身份验证,但是其他后端不会调用login方法。由于不会从休息后端调用登录,因此会话永远不会附加到请求。我将authenticate方法更改为login,我只需通过执行以下操作调用login:

...

@api_view(('POST',))
def login(request, format=None):
    try:
        from django.contrib.auth import login
        if request.user and request.user.is_active:
            login(request, request.user)
            ...
            response = ...
        else:
            response = {}
    except Exception, e:
        response = "An error occurred, {}".format(e)
    return Response(response)