2011-08-24 7 views
8

Posso passare tutto attraverso il loro wiki - e poi sono perso. http://wiki.dreamhost.com/DjangoDistribuzione dell'app Django usando il passeggero

Ho un modello Django vuoto, e ogni volta che provo a cambiare qualcosa ottengo un errore interno del server di 500.

Ho completamente sviluppato la mia app django localmente e voglio solo ospitarla online - ho pensato che sarebbe stato facile ma sto lentamente imparando che non lo è.

Ho caricato i miei video "app" in questa directory, quindi li ho inseriti nelle app installate e ho eseguito "python manage.py syncdb", che non trova fixture (cosa che ho trovato dispari).

Da lì, ottiene solo un errore interno del server.

Qui è l'errore che sto ottenendo: http://tweettune.com/ e qui è il log degli errori:

[Wed Aug 24 01:49:15 2011] [error] [client 66.212.30.122] Premature end of script headers: 
[Wed Aug 24 01:49:15 2011] [error] [client 66.212.30.122] Premature end of script headers: internal_error.html 
[Wed Aug 24 08:16:40 2011] [error] [client 99.229.160.94] Premature end of script headers: 
[Wed Aug 24 08:16:41 2011] [error] [client 99.229.160.94] Premature end of script headers: internal_error.html 
[Wed Aug 24 08:21:38 2011] [error] [client 99.229.160.94] Premature end of script headers: 
[Wed Aug 24 08:21:38 2011] [error] [client 99.229.160.94] Premature end of script headers: internal_error.html 
[Wed Aug 24 08:27:41 2011] [error] [client 99.229.160.94] Premature end of script headers: 
[Wed Aug 24 08:27:41 2011] [error] [client 99.229.160.94] Premature end of script headers: internal_error.html 

Ho cercato per 6 ore e ora non riesco a capire cosa sto facendo male. Suppongo che non capisco proprio come distribuire un'applicazione - il mio processo di pensiero ora è prendere la mia app localmente ospitata e sostituire tutti i file nel modello django predefinito online. Non vedo perché questo non dovrebbe funzionare, ma non lo è. Ho provato l'esempio "ciao mondo app" utilizzando questo codice nel mio file passenger_wdgi e funziona ...

def application(environ, start_response): 
    start_response('200 OK', [('Content-type', 'text/plain')]) 
    return ["Hello, world!"] 

Tutto il senso sarebbe utile.

EDIT: Ecco i contenuti del mio file passenger_wsgi.py che possono essere utili (anche se sono generati automaticamente da dreamhost ... quindi ho pensato che sarebbe corretto).

import sys, os 
sys.path.append(os.getcwd()) 
os.environ['DJANGO_SETTINGS_MODULE'] = "sotd.settings" 
import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 
project_path='/home/tweettune.com/sotd/' 
sys.path.insert(1, project_path) 
+0

mostrare il proprio file di configurazione. –

+0

Scusa, non sono sicuro di cosa intendi con i miei file di configurazione? I contenuti passenger_wsgi.py? Per favore, scusami per la mia ignoranza su questo argomento - la prima volta che cerco di implementare un progetto. – brandonmat

+0

Penso che tu abbia sbagliato i tuoi percorsi. Passare alla directory del progetto nella shell e usare 'pwd' per stampare il nome completo di tale directory. – Marcin

risposta

1

È difficile sapere esattamente cosa si sta comportando male senza visualizzare la configurazione. Ho seguito le istruzioni e non è stato difficile.

Una cosa che puoi fare per eseguire il debug dell'applicazione è eseguire run.py. Non sarà in grado di collegarsi a un socket (e se lo fa, verrà attivato automaticamente dopo pochi minuti), ma ciò mostrerà almeno se ci sono altri problemi che impediscono l'esecuzione della tua app.

Un'altra cosa da notare: il file si chiama passenger_wsgi.py e deve essere pubblicato nella root del sito. Ad esempio, ho ~/testing.tustincommercial.com/passenger_wsgi.py e tutto il mio codice progetto è inferiore a ~/testing.tustincommercial.com/oneclickcos. Il mio contenuto statico vive sotto ~/testing.tustincommercial.com/public.

Può essere utile installare un middleware di gestione degli errori, in modo che gli errori non si propagino fino al passeggero, provocando così un errore 500.

mio wsgi_passenger.py è:

import sys, os, re 
cwd = os.getcwd() 
sys.path.append(os.getcwd()) 

#add all installed eggs to path 
for x in ['/home/marcintustin/django/'+x for x in os.listdir('/home/marcintustin/django/') if re.search('egg$', x)]: 
    sys.path.insert(0,x) 

sys.path.insert(0,'/home/marcintustin/django') 
sys.path.insert(0,'/home/marcintustin/django/Django-1.3') 
sys.path.insert(0,'/home/marcintustin/django/Paste-1.7.5.1-py2.5.egg') 
sys.path.insert(0,'/home/marcintustin/django/South-0.7.3-py2.5.egg') 
sys.path.insert(0,'/home/marcintustin/django/Werkzeug-0.6.2-py2.5.egg') 

myapp_directory = cwd + '/oneclickcos' 
sys.stdout = sys.stderr 
sys.path.insert(0,myapp_directory) 
sys.path.append(os.getcwd()) 

os.environ['DJANGO_SETTINGS_MODULE'] = "oneclickcos.settings" 
import django.core.handlers.wsgi 
#from paste.exceptions.errormiddleware import ErrorMiddleware 
from werkzeug.debug import DebuggedApplication 
from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException 

application = django.core.handlers.wsgi.WSGIHandler() 
handler = AdminMediaHandler(application, '/home/marcintustin/testing.tustincommercial.com/public/static/admin') 
application = DebuggedApplication(handler, evalex=True) 

Questo fa un mucchio di roba, la maggior parte dei quali non è strettamente necessario - tutte le cose in alto è quello di assicurarsi che le librerie che ho installato sono a disposizione. Il materiale in fondo installa il middleware. Probabilmente starai meglio con paste.exceptions.errormiddleware.ErrorMiddleware, a meno che il debugger di werkzeug funzioni per te (non funzionerà per me su Dreamhost).

Modifica: Penso che la tua configurazione sia errata.Per favore vai nella directory che contiene il tuo progetto e usa pwd per ottenere il percorso completo. Penso che scoprirai che non hai le strade giuste.

+0

Suppongo di avere una domanda allora. Mi aspetterei di vedere i normali errori di debug di django se ci fosse un problema con il mio setup o semplicemente restituire un errore di 500 server? – brandonmat

+0

Un errore 500 potrebbe essere causato da eccezioni del codice che si propagano completamente verso l'alto o da un problema con la configurazione. Il punto di installazione del middleware è catturare e visualizzare le eccezioni che escono dal tuo codice. Pertanto, la configurazione errata causerà un errore 500, ma non è l'unica possibile fonte. – Marcin

+0

Risposta PWD - /home/brandonmattalo/tweettune.com e il mio progetto django è /home/brandonmattalo/tweettune.com/sotd – brandonmat

7

Ho avuto lo stesso problema. La soluzione era quella di aggiungere la cartella della mia applicazione nel wsgi_passenger.py

import sys, os 
sys.path.append(os.getcwd()) 
sys.path.append(os.path.join(os.getcwd(), 'include your apps folder here')) 
os.environ['DJANGO_SETTINGS_MODULE'] = "cpc.settings" 
import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 

Questo legame è stato molto utile per me: http://discussion.dreamhost.com/thread-128918.html

0

ho avuto lo stesso identico problema. Le risposte qui mi hanno indirizzato nella giusta direzione, grazie. Uso virtualenv con la mia app django e os.getcwd() lo ha fatto per me.

import os, sys 

#Fix for passenger 
INTERP = "/var/webapps/myapp_env/bin/python" 
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv) 
sys.path.append(os.getcwd()) 
# 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings") 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 
7

Se Django> 1.7 sostituire due ultima riga con

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application()