NotImplementedError: доступен только временный файл. Временный файл доступен для использования
Я использую Django и Google App Engine. Я не могу определить, откуда возникла ошибка, потому что, если я использую ее на локальном компьютере, мой сайт работает. После того, как я развернул его на GAE, он работает нормально, но при использовании googleadwords api появляется эта ошибка:
NotImplementedError: Only tempfile.TemporaryFile is available for use
at PlaceHolder (/base/alloc/tmpfs/dynamic_runtimes/python27/a7637d5531ec9deb_unzipped/python27_dist/lib/python2.7/tempfile.py:45)
at __init__ (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/suds/cache.py:115)
at __init__ (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/suds/client.py:112)
at GetService (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/googleads/adwords.py:459)
at post (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/ksvt/views.py:47)
at dispatch (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/django/views/generic/base.py:88)
at view (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/django/views/generic/base.py:68)
at _get_response (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/django/core/handlers/base.py:185)
at _get_response (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/django/core/handlers/base.py:187)
at inner (/base/data/home/apps/f~xxxx/20180320t181216.408435502723573470/lib/django/core/handlers/exception.py:41)
Может кто-нибудь объяснить, в чем смысл этой ошибки? Спасибо!
Изменить: строка кода, который я думаю, генерирует ошибку.
adwords_client = adwords.AdWordsClient.LoadFromStorage(os.path.dirname(os.path.abspath(__file__)) + "//googleads.yaml")
1 ответ
Решение
Библиотека AdWords использует suds
отправлять SOAP-сообщения в API AdWords. Пакет suds пытается кэшировать данные в файловой системе, что запрещено в стандартной среде App Engine.
README пакета Adwords описывает, как отключить кэширование путем передачи фиктивной реализации кэша клиенту adwords:
adwords_client = adwords.AdWordsClient(
developer_token, oauth2_client, user_agent,
client_customer_id=client_customer_id, cache=suds.cache.NoCache())
(Вам нужно будет импортировать suds.cache
)