我正在为 django 项目创建一个自定义包。该包包含两个身份验证后端。我的模块配置如下,
# Backend 1 module
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
UserModel = get_user_model()
# ModelBackend = object # This will fix actual import issue and uses mocked import only
class AuthBackendOne(ModelBackend):
pass
# Backend 2 module
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
UserModel = get_user_model() # here calls actual django method
class AuthBackendTwo(ModelBackend):
pass
在我的狮身人面像
conf.py
我有autodoc_mock_imports = [ "django.conf", "django.contrib.auth" ]
问题是当我为文档生成 sphinx-build 时,在模块 2 中它试图调用实际的 django
get_user_model()
。没有考虑到被嘲笑。通过自己尝试,我发现问题出在我使用 ModelBackend 作为自定义后端类的基础时。导入 ModelBackend 没有问题,但使用它会破坏模块 2。就在使用 ModelBackend
之前,我已重新分配给 object
并成功运行 sphinx-build。
对于我的测试试验,我在上述两种方法中打印了 UserModel 及其类型,(我在这个测试中没有调用
get_user_model
函数)
cognito - 自定义后端 1 ldap - 自定义后端 2
以正常方式(
ModelBackend
未重新分配给object
):
cognito sources... [ 33%] kala_common.auth.cognito
django.contrib.auth.get_user_model
<class 'django.contrib.auth.get_user_model'>
ldaping sources... [ 40%] kala_common.auth.ldap
<function get_user_model at 0x7f386829f1c0>
<class 'function'>
在测试方法中(
ModelBackend
重新指定为object
):
cognito sources... [ 33%] kala_common.auth.cognito
django.contrib.auth.get_user_model
<class 'django.contrib.auth.get_user_model'>
ldaping sources... [ 40%] kala_common.auth.ldap
django.contrib.auth.get_user_model
<class 'django.contrib.auth.get_user_model'>
注意 ldap 的类型:作为函数和作为类
那么,我应该做什么来解决这个问题,我也尝试过将 ModelBackend 包含在 autodoc 模拟中..
在 django 的后端模块上使用
MagicMock
我能够解决这个问题;
# conf.py - of sphinx
from unittest.mock import MagicMock
sys.modules["django.contrib.auth.backends"] = MagicMock()
如果有人有更好的解决方案,请建议我。