Domanda

Sono nuovo di Python e Django, e quando in seguito alla Django libro ho imparato a conoscere il comando 'python manage.py syncdb' che ha generato le tabelle del database per me. In ambiente di sviluppo che uso SQLite in-memory database, in modo che si cancella automaticamente ogni volta che riavviare il server. Così come il comando 'syncdb' faccio sceneggiatura? (Che dovrebbe essere fatto all'interno del file 'settings.py'?)

Chiarimento

Il PO utilizza un database in memoria, che deve essere inizializzato all'inizio di ogni lavoro di processo con modelli Django definiti contro tale database. Qual è il modo migliore per garantire che il database viene inizializzato (una volta per ogni avvio di processo). Questo sarebbe per l'esecuzione di test, o in esecuzione di un server, sia tramite manage.py runserver o attraverso un processo di server web (come ad esempio con WSGI o mod_python).

È stato utile?

Soluzione

Tutti i comandi di gestione dei Django è possibile accedere a livello di codice :

from django.core.management import call_command
call_command('syncdb', interactive=True)

Idealmente si avrebbe usato un segnale di pre-init su runserver per attivare questa, ma tale segnale doesn' t esistono . Quindi, in realtà, il modo in cui mi piacerebbe gestire questo se fossi voi sarebbe quella di creare un comando di gestione personalizzato, come runserver_newdb ed eseguire questo all'interno di esso:

from django.core.management import call_command
call_command('syncdb', interactive=True)
call_command('runserver')

la documentazione per ulteriori informazioni sulla scrittura personalizzati comandi di gestione.

Altri suggerimenti

Come suggerito da " Dove mettere il codice Django startup? ", è possibile utilizzare il middleware per il vostro codice di avvio. La documentazione Django sono qui .

Per esempio (non testata):

startup.py:

from django.core.exceptions import MiddlewareNotUsed
from django.conf import settings
from django.core.management import call_command

class StartupMiddleware(object):
    def __init__(self):
        # The following db settings name is django 1.2.  django < 1.2 will use settings.DATABASE_NAME
        if settings.DATABASES['default']['NAME'] == ':memory:':
            call_command('syncdb', interactive=False)

        raise MiddlewareNotUsed('Startup complete')

e nel tuo settings.py:

 MIDDLEWARE_CLASSES = (
     'your_project.middleware.startup.StartupMiddleware',

     # Existing middleware classes here
 )

Aggiorna

Ho aggiunto uno script chiamato run.sh nella directory principale del progetto. Questo ha funzionato per me con un database SQLite:

#!/usr/bin/python
from django.core.management import call_command
call_command('syncdb')
call_command('runserver')

risposta originale

io non sono sicuro di capire cosa si intende per "script il comando syncdb". Di solito si esegue python manage.py syncdb dalla riga di comando. Questo è solitamente fatto dopo l'aggiunta di nuovi modelli. Nel caso in cui si desidera facilmente realizzare questo utilizzando un semplice script di shell. Non vedo alcuna ragione per luogo (o invocare) syncdb dall'interno settings.py.

Potrebbe aggiungere più dettagli alla tua domanda? Aggiungere contesto e spiegare che cosa esattamente stai cercando di ottenere fatto?

Si potrebbe creare un nuovo script che si chiama, invece di manage.py che le chiamate manage.py:

from subprocess import call
call(["python", "manage.py", "syncdb"])
call(["python", "manage.py", "runserver"])

Se non è necessario aggiungere un amministratore si potrebbe modificare la seconda riga come questa:

call(["python", "manage.py", "syncdb", "--noinput"])

Sto assumendo che ciò che si sta cercando di fare è creare il vostro db e quindi avviare il server con un comando ogni volta.

La risposta di @ Daniel Naab, così come la doc nel sito ufficiale, non è per l'esecuzione di comandi di gestione come entrypoint.

Quando si desidera utilizzare un comando di gestione come l'entrypoint in ambiente cloud gestito come AWS Lambda o funzioni Google Cloud, è possibile dare un'occhiata a manage.py e provare qualcosa di simile.

import os
from django.core.management import execute_from_command_line

def publishing_fn(data, context):
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'YOURAPP.settings')
    # The first argument is "manage.py" when it's run from CLI.
    # It can be an empty string in this case
    execute_from_command_line(['', 'COMMAND', 'ARGS...'])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top