2010-10-03 34 views
1

J'essaie de déployer mon projet django existant via buildout, en suivant à la lettre les instructions here.Problème de déploiement Django et Buildout

mon fichier est buildout.cfg:

[buildout] 
parts  =  django python 
develop  =  . 
eggs  =  myproject 

[django] 
recipe  =  djangorecipe 
version  =  1.2.3 
project  =  myproject 
projectegg =  myproject 
settings =  settings 
wsgi  =  true 
eggs  =  ${buildout:eggs} 

[python] 
recipe  =  zc.recipe.egg 
interpreter =  python 
eggs  =  ${buildout:eggs} 

Il y a deux problèmes:

  1. Tout d'abord, si je l'invoque interpréteur Python via ./bin/python, je reçois une importation erreur avec myproject d'importation
  2. Ensuite, si je tente de charger le fichier django.wsgi, je reçois aussi une erreur apache
[Sun Oct 03 11:57:37 2010] [error] [client ::1] mod_wsgi (pid=5045): Target WSGI script '/usr/src/django/myproject/bin/django.wsgi' cannot be loaded as Python module. 
[Sun Oct 03 11:57:37 2010] [error] [client ::1] mod_wsgi (pid=5045): SystemExit exception raised by WSGI script '/usr/src/django/myproject/bin/django.wsgi' ignored. 
[Sun Oct 03 11:57:37 2010] [error] [client ::1] Traceback (most recent call last): 
[Sun Oct 03 11:57:37 2010] [error] [client ::1] File "/usr/src/django/myproject/bin/django.wsgi", line 20, in 
[Sun Oct 03 11:57:37 2010] [error] [client ::1]  application = djangorecipe.wsgi.main('myproject.settings', logfile='') 
[Sun Oct 03 11:57:37 2010] [error] [client ::1] File "/usr/src/django/myproject/eggs/djangorecipe-0.20-py2.6.egg/djangorecipe/wsgi.py", line 15, in main 
[Sun Oct 03 11:57:37 2010] [error] [client ::1]  sys.exit(1) 

Mon fichier django.wsgi est (mis à jour selon les modifications proposées):

 
#!/usr/bin/python 


import sys 
sys.path[0:0] = [ 
    '/usr/src/django/myproject/src', 
    '/usr/src/django/myproject/eggs/djangorecipe-0.20-py2.6.egg', 
    '/usr/src/django/myproject/eggs/zc.recipe.egg-1.3.2-py2.6.egg', 
    '/usr/src/django/myproject/eggs/zc.buildout-1.5.1-py2.6.egg', 
    '/usr/local/lib/python2.6/dist-packages', 
    '/usr/local/lib/python2.6/dist-packages', 
    '/usr/src/django/myproject/parts/django', 
    '/usr/src/django/myproject/eggs/setuptools-0.6c12dev_r85190-py2.6.egg', 
    '/usr/src/django/myproject/parts/django', 
    '/usr/src/django/myproject', 
    '/usr/src/django/myproject/src(/usr/src/django/myproject)', 
    '/usr/src/django/myproject', 
    ] 

import djangorecipe.wsgi 

application = djangorecipe.wsgi.main('myproject.settings', logfile='') 

mon bin/django est:

 
#!/usr/bin/python 

import sys 
sys.path[0:0] = [ 
    '/usr/src/django/myproject/src', 
    '/usr/src/django/myproject/eggs/djangorecipe-0.20-py2.6.egg', 
    '/usr/src/django/myproject/eggs/zc.recipe.egg-1.3.2-py2.6.egg', 
    '/usr/src/django/myproject/eggs/zc.buildout-1.5.1-py2.6.egg', 
    '/usr/local/lib/python2.6/dist-packages', 
    '/usr/local/lib/python2.6/dist-packages', 
    '/usr/src/django/myproject/parts/django', 
    '/usr/src/django/myproject/eggs/setuptools-0.6c12dev_r85190-py2.6.egg', 
    '/usr/src/django/myproject/parts/django', 
    '/usr/src/django/myproject', 
    '/usr/src/django/myproject/src(/usr/src/django/myproject)', 
    '/usr/src/django/myproject', 
    ] 


import djangorecipe.manage 

if __name__ == '__main__': 
    djangorecipe.manage.main('myproject.settings') 

Ni l'importation ou le serveur apache semblent travailler

+0

aussi, peut-être quelqu'un avec un score plus élevé pourrait faire une étiquette djangorecipe – Dave

+0

Il existe déjà une balise 'recipe' - il suffit d'ajouter aussi bien que' django' - pas besoin de 'djangorecipe'. –

+0

djangorecipe.wsgi.main() est un script de ligne de commande qui ne doit pas être utilisé dans un fichier de script WSGI. –

Répondre

1

Vous devez probablement définir un chemin d'accès supplémentaire à votre projet afin qu'il soit placé sur le chemin python. Pourriez-vous coller vos fichiers django.wsgi et django?

Essayez cette config:

[buildout] 
parts  =  django python 
develop  =  . 
eggs  =  myproject 
extra_paths = 
    src(path_to your_project_source) 
    ${buildout:directory} 

[django] 
recipe  =  djangorecipe 
version  =  1.2.3 
project  =  myproject 
projectegg =  myproject 
settings =  settings 
wsgi  =  true 
eggs  =  ${buildout:eggs} 
extra-paths = ${buildout:extra_paths} 

[python] 
recipe  =  zc.recipe.egg 
interpreter =  python 
eggs  =  ${buildout:eggs} 
extra-paths = ${buildout:extra_paths} 

Vous pouvez également vous assurer que django.wsgi a des droits exécutables

chmod +x django.wsgi 
+0

quand je fais les chemins supplémentaires = ligne src ... je reçois des chemins wierd dans les scripts django et django.wsgi, comme '/ usr/src/django/monprojet/src (/ usr/src/django/myproject)' . Voir aussi la réponse de Reinout. Est-ce que cette ligne est correcte? Je ne comprends pas très bien la fonction de ce paramètre. – Dave

+0

cette ligne '' src (path_to your_project_source) '' était seulement un exemple de quelque chose comme: src ou "." –

0

La seule chose qui ressemble vraiment étrange: '/usr/src/django/myproject/src(/usr/src/django/myproject)' à la fois votre bac/django et Fichier bin/django.wsgi.

Je n'ai jamais vu ça(). On dirait que ça pourrait casser des choses.

pari Best: il suffit d'exécuter

$> bin/python 
>>> import sys 
>>> print sys.path 

et voir ce python se pense que son chemin est. Buildout le configure bien, mais vous avez quelque chose que je n'ai jamais vu auparavant dans votre script. Une autre alternative: êtes-vous sûr que votre code actuel n'inclut pas les erreurs d'importation qui finissent comme des erreurs d'importation de votre application (cela peut parfois arriver si vous dépendez de bibliothèques de niveau C comme PIL ou cx_oracle).

+1

dosent 1.2.3 indique la version django, pas la version djangorecpie? – Dave

+0

Oopsie, tu as raison, je dormais. J'ai corrigé ma réponse. –

+0

Je pense que les trucs() provenaient du bit extra_paths = src (chemin_votre_projet_source), une commande que je ne comprends pas vraiment le but de ... que devrais-je chercher dans l'impression sys.path? mon code dosent avoir des erreurs d'importation si j'utilise l'interpréteur pythong normal. – Dave

3

votre problème est que vous définissez mal vos dépendances d'œufs dans la recette

dans la partie buildout la ligne

eggs = myproject 

vous configurez votre propre projet django myproject comme une dépendance

dans ce cas, vous devez définir tous les oeufs python (paquets) qui sont des dépendances pour votre projet django

pour e xemple

eggs = 
    psycopg2 
    south 
    django-debug-toolbar 
    django-extensions 

si votre projet utilisent connecteur psycopg2 postgresql, au sud pour les migrations de bases de données et django-debug-barre d'outils et django-extensions

vous pouvez exclure de cette liste les packages que vous avez dans votre système de python installer.

supprimer votre projet du oeufs paramètres, celui-ci confondre votre buildout.

+0

mais selon http://jacobian.org/writing/django-apps-with-buildout/ je pensais que si je ne définissez pas mon projet dans la section des œufs buildout, alors je ne peux pas le rendre disponible pour les autres parties ... ou mieux dit à partir de ce lien "Nous voulons que l'oeuf que nous développons soit disponible pour tous les scripts qui s'exécutent dans cet environnement, donc nous avons mis eggs = django-shorturls pour obtenir l'oeuf que nous développons installé.". Est-ce que j'ai râté quelque chose? – Dave

+0

oui, django-ulrs est une application django, pas un projet django, Jacob configure django-shorturls comme un oeuf développeur dans leur déploiement pour être compatible avec le schéma setuptools/buildout. Dans votre cas, vous devez définir le paramètre de chemin supplémentaire et ajouter votre projet ici. –

0

Ce qui a fonctionné pour moi était tout simplement pas toucher le buildout lui-même du tout, et tout simplement en vous assurant que tous les œufs étaient en PYTHONPATH lorsque le script est exécuté .wsgi. Le scénario lui-même .wsgi ressemblait à ce qui suit:

import os 
import sys 

PREFIX = '/path/to/my/app' # the buildout is here 

BUILDOUT_EGGS = [ 
    'Django-1.3-py2.6.egg', 
    'South-0.7.6-py2.6.egg', 
    'django_haystack-1.2.7-py2.6.egg', 
    'djangopypi-0.4.4-py2.6.egg', 
    'docutils-0.9.1-py2.6.egg', 
    'setuptools-0.6c12dev_r88846-py2.6.egg', 
    'zc.recipe.egg-1.3.2-py2.6.egg', 
    'Whoosh-2.4.1-py2.6.egg', 
    'django_registration-0.8_alpha_1-py2.6.egg', 
    'djangorecipe-1.2.1-py2.6.egg', 
# 'pkginfo-0.9-py2.6.egg',                                                         
# 'zc.buildout-1.6.0-py2.6.egg',                                                        

] 

sys.path[0:0] = [PREFIX] + ['%s/eggs/%s' % (PREFIX, egg) for egg in BUILDOUT_EGGS] 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' 

import djangorecipe.wsgi 
application = djangorecipe.wsgi.main('myapp.settings', logfile='myapp.log')