Add support for string type AXES_USERNAME_CALLABLE

Signed-off-by: Aleksi Häkli <aleksi.hakli@iki.fi>
This commit is contained in:
Aleksi Häkli 2019-02-16 19:04:11 +02:00 committed by Aleksi Häkli
parent 97410a7b06
commit bc24d12975
No known key found for this signature in database
GPG key ID: 3E7146964D726BBE
2 changed files with 22 additions and 4 deletions

View file

@ -245,6 +245,18 @@ class UtilsTestCase(TestCase):
with self.assertRaises(TypeError):
get_client_username(HttpRequest(), {})
@override_settings(AXES_USERNAME_CALLABLE=True)
def test_get_client_username_not_callable(self):
with self.assertRaises(TypeError):
get_client_username(HttpRequest(), {})
@override_settings(AXES_USERNAME_CALLABLE='axes.tests.test_utils.get_username')
def test_get_client_username_str(self):
self.assertEqual(
get_client_username(HttpRequest(), {}),
'username',
)
class LockoutResponseTestCase(TestCase):
def setUp(self):

View file

@ -6,6 +6,7 @@ from socket import error, inet_pton, AF_INET6
from django.core.cache import caches, BaseCache
from django.http import HttpResponse, HttpResponseRedirect, HttpRequest, JsonResponse
from django.shortcuts import render
from django.utils.module_loading import import_string
import ipware.ip2
@ -85,14 +86,19 @@ def get_client_username(request: HttpRequest, credentials: dict = None) -> str:
"""
if settings.AXES_USERNAME_CALLABLE:
logger.debug('Using AXES_USERNAME_CALLABLE to get username')
return settings.AXES_USERNAME_CALLABLE(request, credentials)
logger.debug('Using settings.AXES_USERNAME_CALLABLE to get username')
if callable(settings.AXES_USERNAME_CALLABLE):
return settings.AXES_USERNAME_CALLABLE(request, credentials)
if isinstance(settings.AXES_USERNAME_CALLABLE, str):
return import_string(settings.AXES_USERNAME_CALLABLE)(request, credentials)
raise TypeError('settings.AXES_USERNAME_CALLABLE needs to be a string, callable, or None.')
if credentials:
logger.debug('Using `credentials` to get username with key AXES_USERNAME_FORM_FIELD')
logger.debug('Using parameter credentials to get username with key settings.AXES_USERNAME_FORM_FIELD')
return credentials.get(settings.AXES_USERNAME_FORM_FIELD, None)
logger.debug('Using `request.POST` to get username with key AXES_USERNAME_FORM_FIELD')
logger.debug('Using parameter request.POST to get username with key settings.AXES_USERNAME_FORM_FIELD')
return request.POST.get(settings.AXES_USERNAME_FORM_FIELD, None)