2010-01-20 14 views
13

Ogni volta che accedo al mio server tramite SSH ho bisogno di digitare il seguente:Perché ho bisogno del set DJANGO_SETTINGS_MODULE?

export DJANGO_SETTINGS_MODULE=settings 

se non lo faccio qualsiasi utilizzo del modulo manage.py fallisce

mio manage.py ha la seguente codice aggiunto:

if "notification" in settings.INSTALLED_APPS: 
    from notification import models as notification 

    def create_notice_types(app, created_models, verbosity, **kwargs): 
     notification.create_notice_type("friends_invite", _("Invitation Received"), _("you have received an invitation")) 
     notification.create_notice_type("friends_accept", _("Acceptance Received"), _("an invitation you sent has been accepted")) 

    signals.post_syncdb.connect(create_notice_types, sender=notification) 
else: 
    print "Skipping creation of NoticeTypes as notification app not found" 

Qualche idea?

risposta

11

Il numero manage.py fa riferimento a un'applicazione (notifications). Questo costringe Django a lamentarsi del fatto che DJANGO_SETTINGS_MODULE sia impostato perché l'ambiente Django non è ancora stato impostato.

Per inciso, è possibile forzare manualmente l'impostazione dell'ambiente, ma sinceramente non lo farei in manage.py. Questa non è davvero una buona pratica secondo me.

Ecco come è possibile impostare manualmente l'ambiente Django dall'interno di qualsiasi applicazione (o un programma per quella materia):

# set up the environment using the settings module 
from django.core.management import setup_environ 
from myapp import settings 
setup_environ(settings) 
+0

Grazie per l'ottima risposta. Vuoi dire che non è raccomandato perché riduce la portabilità? Spiega perché. – RadiantHex

+2

Sì, riduce la portabilità. Tutto ciò che accoppia lo strumento di gestione a un'applicazione dovrebbe essere evitato. Applicazioni e progetti dovrebbero tutti avere parti mobili in modo indipendente. Immagina un futuro in cui è necessario spostare un'applicazione in un altro progetto o rimuoverne uno da un progetto corrente. È meglio non averli intrecciati e invece eseguire qualsiasi tipo di controllo (sicuro) all'interno delle app stesse. – jathanism

6

È necessario impostare la variabile d'ambiente DJANGO_SETTINGS_MODULE perché è come Django sa che cosa il vostro modulo impostazioni viene chiamato (quindi puoi averne diversi per progetto o per test e sviluppo). Puoi impostarlo negli script stessi prima dello importando django (direttamente o indirettamente) ma che non farà molto bene quando esegui il Django -programmi forniti.

La soluzione più semplice è probabilmente quella di impostare semplicemente DJANGO_SETTINGS_MODULE negli script di avvio della shell, quindi non sarà necessario impostarlo manualmente. I soliti file per aggiungerlo sono .bash_profile e .bashrc (se si usa effettivamente bash.)

+0

Grazie Thomas. Puoi indicarmi in qualche direzione riguardo agli script di bash? Sto effettuando l'accesso tramite Putty e non ho idea di quando gli script potrebbero dare il via. – RadiantHex

+1

Beh, la documentazione per qualsiasi sistema operativo o distribuzione in cui si sta effettuando l'accesso sarebbe un buon inizio :) Ma una buona scommessa è solo aggiungendo la stessa linea di esportazione come stavi già utilizzando nel tuo file .bash_profile o .bashrc, da qualche parte vicino ad altre linee di esportazione simili. Ciascuno di essi deve essere caricato per ogni nuova shell. –

0

Per impostazione predefinita, manage.py cerca un modulo delle impostazioni nella stessa directory di se stesso. Se non ne trova uno, bombarda con un messaggio per usare django-admin.py. In realtà non imposta l'ambiente finché non viene eseguito execute_manager. Se hai bisogno di eseguire i tuoi hook prima di chiamare le funzioni di gestione, la pratica che ho visto suggerito è di inserirli nell'app corrispondente models.py.

Problemi correlati