2012-04-13 4 views
0

Я использую Heroku с Django и использую Piston для API.Heroku + Django + Piston

Мы мигрировали из простого Amazon EC2 в Heroku. Все работает (каждый аспект сайта), за исключением некоторых вызовов API.

Когда я запускаю вызов API, чтобы получить список объектов (деревьев), которые пользователь имеет, я получаю следующее:

RuntimeError at /api/tree.json 
maximum recursion depth exceeded while calling a Python object 

Кто-нибудь есть какие-либо идеи о том, почему это может быть? Заранее благодарим за любые советы/советы!

+0

Я нашел эту статью, которая, похоже, указывает на ту же проблему, что у меня есть ** Репликация эмиттера ForeignKey может быть бесконечной и сбой python ** https://bitbucket.org/jespern/django-piston/issue/164/foreignkey -emitter-recursion-can-be – Alexandre

+0

Я получил ответ от поддержки Heroku, они говорят, что они установили стандартный предел рекурсии на 1000. Они не знают о какой-либо несовместимости между Piston и Heroku. – Alexandre

ответ

1

Это была сложная проблема для отладки. Оказалось, что проблема в том, что динамики Heroku не могут видеть временную директорию друг друга. Это означало, что после перехода на Heroku, хотя мы написали файл во временный каталог, когда мы запланировали задачу для обработки этого файла, файл таинственным образом не был бы там. Мы решили это, записав файлы непосредственно на S3 (вместо использования временного каталога).

Кроме того, новая версия Piston имеет изменение схемы базы данных, поэтому убедитесь, что она обновляется правильно!

+0

https://devcenter.heroku.com/articles/dyno-isolation#ephemeral_filesystem – Alexandre

0

Это в основном означает, что ваши три слишком структурированы и что функция, которая его декодирует (которая является рекурсивной), превышает максимальный предел глубины для рекурсивных вызовов (например, пример глубины рекурсии = 3 - это функция, вызывающая функция, которая вызывает другую функцию, которая вызывает другую функцию). Если вы используете собственный алгоритм для декодирования json, просто убедитесь, что он перешел от рекурсивного подхода к итеративному подходу (это можно сделать с помощью множества алгоритмов, реализующих кий). Постарайтесь, чтобы увидеть, что ваш предел рекурсивных операций:

>>> import sys 
>>> sys.getrecursionlimit() 
1000 #on my mac but this is system dependent. 

И если вы не удовлетворены его изменить следующим образом:

>>> sys.setrecursionlimit(...) 

Избегайте установки на большое число, так как они могут привести к сбою системы; и я уверен, что герою каким-то образом ограничивает максимальную рекурсию глубины.

+0

Не похоже, что это связано с ограничениями рекурсии. Даже после увеличения лимита я все равно получаю ту же проблему. Спасибо за предложение, хотя – Alexandre

Смежные вопросы