Django 2.x自定义身份验证后端问题

时间:2019-01-22 11:02:01

标签: python-3.x authentication django-2.1

最近,我正在尝试开发TDD技能,因此我正在阅读和编写“使用Python进行测试驱动的开发,第二版”的书

我已经遵循了所有内容,仅作了必要的更改以使用Django 2.x,而不是本书中的1.x。

我的问题如下: 我运行了用于身份验证方法的单元测试,并且一切正常,但是当我运行功能测试以检查是否可以登录时,就好像自定义后端无法正常工作。

到目前为止,我已经用很多痕迹来分隔错误,这是单元测试的日志:

$ python manage.py test accounts.tests.test_authentication
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
Custom authenticate method
Custom authenticate method, token exist
.Custom authenticate method
Custom authenticate method, token exist
.Custom authenticate method
Custom authenticate method, token exist
Custom authenticate method, user creation
...
----------------------------------------------------------------------
Ran 5 tests in 0.006s

OK

这些跟踪位于自定义身份验证后端中,并且(我认为)它工作正常。自定义后端在三种情况下都可以正常工作。

当我启动登录功能测试时,我得到以下信息:

$ python manage.py test functional_tests.test_login
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
Not Found: /favicon.ico
login view uid 78105893-b658-4160-80e7-3f84649441e7
login view user None
E
======================================================================
ERROR: test_can_get_email_link_to_log_in (functional_tests.test_login.LoginTest)
----------------------------------------------------------------------

[...]

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: Log out

----------------------------------------------------------------------
Ran 1 test in 15.118s

FAILED (errors=1)

功能测试无法找到注销视图,因为它没有先登录。查看功能测试跟踪的开始:

$ python manage.py test functional_tests.test_login
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
Not Found: /favicon.ico
login view uid 78105893-b658-4160-80e7-3f84649441e7
login view user None
E

我们可以看到我在登录视图方法中放入的一些痕迹。

def login(request):
    uid = request.GET.get('token')
    print('login view uid', uid, file=sys.stderr)
    user = auth.authenticate(uid=uid)
    print('login view user', user, file=sys.stderr)

    if user:
        auth.login(request, user)
    return redirect('/')

因此,此刻我正在从请求中获取UID,但是当我使用auth.authenticate时,它什么也没做。

正如我在settings.py中配置为使用自定义身份验证后端那样,auth.authenticate(uid=uid)正在呼叫我的自定义身份验证后端,是吗?

AUTH_USER_MODEL = 'accounts.User'

AUTHENTICATION_BACKENDS = [
    'accounts.authentication.PasswordlessAuthenticationBackend',
]

但是...如果我使用的是自定义身份验证后端,即使UID存在问题,也应该有痕迹。

也许这个问题涉及面很广,我试图通过阅读Django 2.x文档和此处的相关问题来找到答案,但是我找不到响应,因此我被困在这里。 Django 1.x和2.x之间的自定义身份验证后端的配置是否有差异?

预先感谢

0 个答案:

没有答案