2016-03-31 4 views
1

Nach der modifizierten inspectdb möchte ich es ausführen, wenn die Indexseite im Web geladen ist. Also, meiner view.py - def Index, versuche ich bin die nächste zu tun:Wie zum Ausführen von externen Befehl (Django) zum Überschreiben von Dateien im Server?

def index(request): 
subprocess.Popen("rm /path/app/models.py", shell=True) 
subprocess.Popen("python2.7 /path/manage.py inspectdb_New > /path/app/models.py", shell=True) 
return render_to_response('index/index.html', context_instance = RequestContext(request)) 

, die nicht funktioniert. Ich habe es mit os.system, subprocess.call versucht, aber es funktioniert immer noch nicht. Für mich sieht zumindest aus, als ob ich models.py in der Ausführungszeit nicht ändern kann, aber ich weiß nicht, was das Problem sein könnte ...

Irgendwelche Idee Leute?

Danke.

Antwort

1

Sie können Ihre models.py nicht ändern, während der Webserver läuft, weil Modelle (und anderer Python-Code) nur beim Serverstart geladen werden.

+0

Ich bin mir nicht wirklich sicher. Ich denke Server ist Beratungsmodell jede kurze Zeit. Ich versuche jetzt: subprocess.Popen ("python2.7/Pfad/manage.py inspectdb> /path/app/models1.py", Shell = True) subprocess.Popen ("mv/Pfad/models1. py /path/models.py ", shell = True) Und das funktioniert manchmal. Ich nehme an, wenn der Server Modelle konsultiert und der externe Befehl gleichzeitig übersteuert, stürzt das Web ab, und die Modelle enden leer, aber zu einem anderen Zeitpunkt funktioniert es wieder (wenn die Überbewertung nicht mit der Serverberatung übereinstimmt) ... –

+1

Nein Modelle werden nur beim Start geladen. Vielleicht erklärst du, was du erreichen willst. Es gibt wahrscheinlich eine bessere/einfachere Lösung. – ilse2005

+0

Nun, ich möchte Modelle jedes Mal aktualisieren, wenn jemand ddbb ändert (Löschen, Hinzufügen, Ändern von Tabellen, ...) und diese Änderungen werden im Web widergespiegelt (Web wird immer gestartet) –

1

Es gibt 2 Teile in Frage: a) Sie möchten, dass die Shell etwas macht, wenn die View-Funktion aufgerufen wird. Ich habe bereits Alarmsignale. b) Sie möchten ein neues Modell laden. Es wird nicht passieren. Sie müssen neu laden, damit neuer Code geladen wird (Modell introspected usw.). Wahrscheinlich verwenden Sie runserver Befehl, werfen Sie einen Blick auf Django Autoreloader Code: https://github.com/django/django/blob/master/django/utils/autoreload.py

Es verfolgt Dateien von gen_filenames() aufgelistet und neu zu laden, wenn etwas geändert wurde. Ihr Modell wurde nicht aufgelistet, sodass die Änderung des Codes nicht berücksichtigt wird.

Ich würde etwas berühren oder .pyc Dateien entfernen, um den Wiederlader zu erzwingen.

+0

Ich überprüfe Autoreloader, ist nicht was ich brauche. Ich habe einen benutzerdefinierten Django-Admin erstellt, sodass ich inspectdb überschreibe, um models.py und admin.py mit dem spezifischen Code zu generieren, den ich brauche. Wenn jemand Änderungen am ddbb-Schema (durch MySQL) vornimmt, möchte ich außerdem die neuen models.py und admin.py dynamisch generieren, und diese Änderungen sollten sich im Web widerspiegeln, ohne den Server zu stoppen (er sollte immer gestartet werden). Schließlich unterbreche ich, ich werde den Server stoppen, neue Inspectdb starten und ich werde den Server erneut starten, um diese Änderungen im Web widerzuspiegeln ... Wie auch immer, danke peroksid für Ihre Hilfe. Prost Mate. –

Verwandte Themen