Python ';非类型';对象没有属性';从"设置"文件';(boxsdk.JWTAuth)

Python ';非类型';对象没有属性';从"设置"文件';(boxsdk.JWTAuth),python,django,python-3.x,box,boxsdk,Python,Django,Python 3.x,Box,Boxsdk,我正在尝试使用django使用boxsdk将文件上载到box.com,同时将应用程序部署到heroku。问题是我的代码在本地dev服务器上运行良好,但在heroku上运行不好。如果应用程序在本地运行,并且使用heroku local web 对于本地dev服务器,我能够为auth导入一个json文件。对于heroku,因为它不接受conf文件,所以我使用heroku:config将文件存储为环境变量 from boxsdk import JWTAuth, Client from io impor

我正在尝试使用django使用boxsdk将文件上载到box.com,同时将应用程序部署到heroku。问题是我的代码在本地dev服务器上运行良好,但在heroku上运行不好。如果应用程序在本地运行,并且使用heroku local web

对于本地dev服务器,我能够为auth导入一个json文件。对于heroku,因为它不接受conf文件,所以我使用heroku:config将文件存储为环境变量

from boxsdk import JWTAuth, Client
from io import StringIO
import os
jsonpath = f'{STATIC_ROOT}/conf/box.json'
try:
    auth = JWTAuth.from_settings_file(jsonpath)
except:
    BOXCONF = os.environ.get('BOXCONF')    
    msg = f'The value of BOXCONF is {BOXCONF}'
    capture_message(msg)
    auth = JWTAuth.from_settings_file(StringIO.new(BOXCONF))
client = Client(auth)
service_account = client.user().get()
print('Service Account user ID is {0}'.format(service_account.id))
我已经使用Sentry的capture_消息测试了是否设置了BOXCONF,它显示以下内容:

The value of BOXCONF is {
"boxAppSettings": {
    "clientID": "abcd",
    "clientSecret": "abc",
    "appAuth": {
    "publicKeyID": "xyz",
    "privateKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----\nblabla\n-----END ENCRYPTED PRIVATE KEY-----\n",
    "passphrase": "1234"
    }
},
"enterpriseID": "1234"
}
我收到的错误消息是:

AttributeError: 'NoneType' object has no attribute 'from_settings_file'
File "django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
File "django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
File "django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
File "app/views.py", line 281, in fileupload
    link = handle_uploaded_file(request.FILES['docfile'], sectionchoice, sectiontext, sectiondescription, filename, filedescription)
File "app/views.py", line 353, in handle_uploaded_file
    auth = JWTAuth.from_settings_file(StringIO.new(BOXCONF))

我承认我忽略了boxsdk文档的一部分,其中提到boxsdk的JWTAuth要求安装boxsdk时附带JWTAuth的其他依赖项

所以在我的例子中,对于本地机器,我需要做:

pip install boxsdk[jwt]
对于heroku,我需要在requirements.txt中添加以下内容:

boxsdk[jwt]>=2.0.0

一旦安装了具有适当依赖关系的boxsdk,错误就会消失。线索在于模块的dir中如何缺少所需的方法。感谢Box开发团队的Matt Willer为您提供了正确的方向。

这还不是您的全部代码。在某个地方,您将JWTAuth设置为None。显示整个handle\u上传的\u文件功能。(我应该注意,这是一个进行身份验证的奇怪地方。)这是该函数中的完整代码。至少到导致错误的行为止,这些导入是否真的在函数本身内部?函数定义在哪里?函数放在views.py的最后一个位置。是的,这些导入在函数定义中。我试着把它们移到视图的开头,没有任何变化。