web-dev-qa-db-fra.com

Comment puis-je modifier Procfile pour exécuter le processus Gunicorn dans un dossier non standard sur Heroku?

Heroku et Gunicorn sont nouveaux, je ne suis donc pas sûr de savoir comment cela fonctionne. Mais j'ai fait quelques recherches et je pense que je suis sur le point de déployer mon application Django (1.5.1). Donc, je sais que j'ai besoin d'un Procfile qui a

web: gunicorn app.wsgi

Parce que mes répertoires sont un peu différents. Je ne peux pas exécuter gunicorn dans le répertoire racine

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

Normalement, app/serait le répertoire racine, mais j’ai décidé de structurer mes dossiers de manière à séparer mon application Django de quelques autres choses. Puisque je dois mettre le fichier Procfile dans le répertoire racine pour que heroku le reconnaisse, que dois-je mettre dans le fichier Procfile et/ou quels paramètres dois-je placer dans la commande gunicorn?

Remarque:

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
41
Derek

Essayer:

web: gunicorn --pythonpath app app.wsgi
53

Comme @Graham Dumpleton l'a déclaré dans sa réponse, le problème du PO pourrait être résolu en modifiant son Procfile comme suit: 

web: gunicorn --pythonpath app app.wsgi

Pourquoi ça marche:

  • Rappelez-vous que Heroku utilise simplement Procfile pour lancer les processus. Dans ce cas, les processus gunicorn.
  • L'argument --pythonpath de Gunicorn vous permet de relier dynamiquement un répertoire à la liste des répertoires que le moteur d'exécution Python recherche lors de la recherche de modules.
  • En ajoutant --pythonpath app à la commande gunicorn, l'interprète s'est en fait fait dire 'regardez à l'intérieur du répertoire de l'application pour trouver un paquet (aussi) appelé appelé qui contient un module appelé wsgi. `

Les noms génériques des dossiers dans la question du PO peuvent masquer la syntaxe de la commande, qui est la suivante: gunicorn --pythonpath <directory_containing_package> <package>.<module>

Plus d'infos:
Documentation Gunicorn

41
eikonomega

J'ai fait un vilain bidouillage pour que cela fonctionne. Je vais donc poster ma réponse, mais j'espère que vous pourrez trouver une meilleure solution.

Procfile

web: sh ./app/run.sh

app_project/app/run.sh

#!/bin/bash

cd app
gunicorn app.wsgi
4
Derek

J'aime la réponse de eikonomega, mais je voulais ajouter comment j'ai résolu un problème similaire:

Le mien était un peu plus dur, car mon dossier était dans plusieurs dossiers.

Au lieu d'ajouter le chemin d'accès à la variable d'environnement PYTHONPATH, je l'ai référencé comme si vous référencez des modules dans un package:

Dans mon cas, l'objet app se trouvait dans un script1.py, à l'intérieur d'un dossier de réponses, à l'intérieur du dossier app8-web-financial-graph.

web: gunicorn app8-web-financial-graph.answers.script1:app
0
ButterHub