2012-04-13 43 views
0

Ich benutze Heroku mit Django und benutze Piston für API Sachen.Heroku + Django + Kolben

Wir wanderten von einfachen Amazon EC2 nach Heroku. Alles funktioniert (jeder Aspekt der Website) mit Ausnahme einiger API-Aufrufe.

Wenn ich einen API-Aufruf, um eine Liste von Objekten (Bäume) zu erhalten, dass der Benutzer hat, erhalte ich die folgende:

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

Wer irgendwelche Ideen, warum dies sein könnte? Vielen Dank im Voraus, ich würde wirklich alle Hinweise/Ratschläge zu schätzen wissen!

+0

Ich fand diesen Artikel, der auf das gleiche Problem zu zeigen scheint, die ich habe ** ForeignKey-Emitter Rekursion kann unendlich sein und stürzt Python ** https://bitbucket.org/jespern/django-piston/issue/164/foreignkey -emitter-recursion-can-be – Alexandre

+0

Ich habe eine Antwort vom Heroku-Support bekommen, sie sagen, dass sie das Standard-Rekursionslimit auf 1000 gesetzt haben. Sie wissen nichts von Inkompatibilitäten zwischen Piston und Heroku. – Alexandre

Antwort

1

Dies war ein schwieriges Problem beim Debuggen. Es stellte sich heraus, dass das Problem darin bestand, dass Heroku-Dynas nicht das jeweils andere temporäre Verzeichnis sehen konnten. Das bedeutete, dass nach der Migration zu Heroku, obwohl wir eine Datei in das temporäre Verzeichnis geschrieben hatten, die Datei auf mysteriöse Weise nicht da war, wenn wir eine Aufgabe zur Verarbeitung dieser Datei einplanten. Wir haben das gelöst, indem wir die Dateien direkt in S3 geschrieben haben (anstatt das temporäre Verzeichnis zu benutzen).

Auch die neue Version von Piston hat eine Datenbankschemaänderung, also stellen Sie sicher, dass diese korrekt aktualisiert wird!

+0

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

0

Dies bedeutet im Grunde, dass Ihre drei ein bisschen zu strukturiert ist und dass die Funktion, die es dekodiert (die rekursiv ist) die maximale Tiefe für rekursive Aufrufe (zum Beispiel ein Beispiel für Rekursionstiefe = 3 ist eine Funktion, die a aufrufen Funktion, die eine andere Funktion aufruft, die eine andere Funktion aufruft). Wenn Sie einen benutzerdefinierten Algorithmus zum Dekodieren von Json verwenden, stellen Sie sicher, dass Sie von einem rekursiven Ansatz zu einem iterativen Ansatz wechseln (dies kann mit vielen Algorithmen geschehen, die einen Cue implementieren). Versuchen Sie, um zu sehen, was Ihr Limit von rekursiven Operationen ist:

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

Und wenn Sie damit nicht zufrieden sind wie folgt zu ändern:

>>> sys.setrecursionlimit(...) 

Vermeiden Sie zu hohen Zahl einstellen, weil es Ihr System zum Absturz bringen kann; und ich wette, dass Heroku die maximale Tiefenrekursion irgendwie begrenzt.

+0

Es scheint nicht so zu sein, dass dies mit Rekursionslimits zu tun hat. Auch nachdem ich das Limit erhöht habe, bekomme ich immer noch das gleiche Problem. Danke für den Vorschlag obwohl – Alexandre