2013-05-07 10 views
35

Ich bin neu in Heroku und Gunicorn, also bin ich mir nicht sicher, wie das funktioniert. Aber ich habe ein wenig gesucht und denke, dass ich kurz davor bin, meine Django-App (1.5.1) zu installieren. Also ich weiß, ich brauche ein Procfile, das hatWie kann ich Procfile so ändern, dass der Gunicorn-Prozess in einem nicht standardmäßigen Ordner auf Heroku ausgeführt wird?

Da meine Verzeichnisse sind ein bisschen anders. Ich kann nicht gunicorn im Stammverzeichnis

app_project 
    requirements/ 
    contributors/ 
    app/ 
     app/ 
      settings/ 
      wsgi.py 
     # Normally Procfile goes here 
    Procfile 

Normalerweise app/wäre das Root-Verzeichnis laufen, aber ich beschloss, meine Ordner auf diese Weise zu strukturieren meine django app von einigen anderen Dingen zu trennen. Da ich die Procfile in das Root-Verzeichnis für heroku legen muss, um sie zu erkennen, was sollte ich in die Procfile legen und/oder welche Parameter sollte ich in den gunicorn-Befehl legen?

Hinweis:

web: gunicorn app.wsgi # won't work because Procfile is in a directory above 
         # I also want to keep the directories as is 
         # I also don't want to create a secondary git inside the app folder just for heroku 
web: gunicorn app.app.wsgi # won't work because I don't want to convert the folder into a python module 
+0

I‘ M Neugierig ... Warum möchten Sie nicht eine __init__.py-Datei in die Top-Ebene App/Ordner hinzufügen? – eikonomega

+0

Ich habe versucht, \ _ \ _ init \ _ \ _. Py dem Verzeichnis der obersten Ebene im selben Projektlayout hinzuzufügen, und es werden nicht alle Fehler behoben. Obwohl Sie den Projektimportfehler übergeben, kommt es zu Einstellungsimportfehler, da sie nicht im Python-Pfad sind. Grahams Lösung ist also wahrscheinlich die beste, die es gibt. –

Antwort

3

machte ich eine hässliche Hack für diese Arbeit zu bekommen. Also werde ich meine Antwort schreiben, aber ich hoffe, euch mit einer besseren Lösung kommen können

procfile

web: sh ./app/run.sh 

app_project/app/run.sh

#!/bin/bash 

cd app 
gunicorn app.wsgi 
43

Versuchen:

web: gunicorn --pythonpath app app.wsgi 
+1

Ich habe buchstäblich nur eine halbe Stunde auf der Suche nach einem Workaround verbracht. Vielen Dank! –

+1

@ansimionescu rufen Sie sich glücklich! :) – martynas

+0

Ein anderer Typ, der meinen Tag gerettet hat! <3 –

31

Als @Graham Dumpleton in seiner Antwort erklärt, das Problem des OP konnte durch Modifikation seiner procfile zum f gelöst werden ach:

web: gunicorn --pythonpath app app.wsgi

Warum dies funktioniert:

  • Denken Sie daran, dass die procfile einfach durch Heroku verwendet wird, Prozesse zu starten. In diesem Fall verarbeitet Gunicorn.
  • Das Argument --pythonpath von Gunicorn ermöglicht es Ihnen, dynamisch ein Verzeichnis an die Liste der Verzeichnisse anzuhängen, nach denen die Python-Laufzeit sucht, wenn Modul-Lookups durchgeführt werden.
  • Durch Hinzufügen von --pythonpath app zum Gunicorn-Befehl wurde dem Interpreter grundsätzlich gesagt: 'Blick ins App-Verzeichnis für ein Paket (auch) namens app, das ein Modul namens wsgi enthält. `

Die generischen Namen der Ordner in der Frage des OP kann die Syntax des Befehls verschleiern, die wie folgt lautet: gunicorn --pythonpath <directory_containing_package> <package>.<module>

Mehr Info:
Gunicorn Documentation

+0

Ausgezeichnete Erklärung der verschiedenen Argumente – kas