Search code examples
djangodjango-rest-frameworkdjango-sessions

Does the Django Rest APIClient class make an actual request?


I am wondering if the request is actually being made via http. In my app I have a test that looks like

class Authenticate(APITestCase):

    def setUp(self):
        self.client = APIClient()
        self.password_for_admin = '123456'
        self.admin = User.objects.create_superuser(username='myname', email='[email protected]', 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

And in my view I've got:

@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)

My settings looks like:

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

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

The request is being printed out as None in my log file. I need to get the session. I tried request.session (which was None) and that's what led me to this question.


Solution

  • I figured it out. The server does send a request using the testserver domain. This was sort of a misleading question and the code was wrong. The user is already authenticated using the rest basic backend by the time they reach this view method.

    Through much research I found out that the user was being authenticated by rest but the login method doesn't get called by the rest backend. Since login doesn't get called from a rest backend the session is never attached to the request. I changed the authenticate method to login and I simply called login by doing this:

    ...
    
    @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)