Sphinx 在 django 的自定义包中使用 django `get_user_model` 模拟问题

问题描述 投票:0回答:1

我正在为 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 python-sphinx autodoc
1个回答
0
投票

在 django 的后端模块上使用

MagicMock
我能够解决这个问题;

# conf.py - of sphinx

from unittest.mock import MagicMock

sys.modules["django.contrib.auth.backends"] = MagicMock()

如果有人有更好的解决方案,请建议我。

© www.soinside.com 2019 - 2024. All rights reserved.