Объект 'NoneType' не имеет атрибута 'from_settings_file' (boxsdk.JWTAuth) - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь использовать django для загрузки файлов на box.com с помощью boxsdk, при развертывании приложения на heroku.Проблема в том, что мой код прекрасно работает на локальном сервере dev, а не на heroku.Это также работает, если приложение запускается локально с heroku local web

. Для локального сервера разработки я могу импортировать файл 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))

Я проверил, что BOXCONF установлен, используя capture_message из Sentry, и онотображает следующее:

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))

1 Ответ

0 голосов
/ 26 декабря 2018

Признаюсь, что я пропустил часть документации для boxsdk, в которой упоминается, что JWTAuth для boxsdk требует установки boxsdk с дополнительными зависимостями для JWTAuth.

Так что в моем случае для локальной машины янужно было сделать:

pip install boxsdk[jwt]

А для heroku мне нужно было добавить следующее в require.txt:

boxsdk[jwt]>=2.0.0

Как только boxsdk был установлен с правильными зависимостями, ошибка исчезла.Подсказка заключалась в том, что требуемый метод отсутствовал в директории модуля.Спасибо Мэтту Виллеру из команды разработчиков Box за то, что указал мне в правильном направлении.

...