2016-03-31 8 views
1

inspectdbを修正した後、Web上のインデックスページがロードされたときに実行したい。したがって、私のview.py - defインデックスでは、私は次をしようとしています:サーバのファイルを上書きするために外部コマンド(Django)を実行する方法は?

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)) 

これは動作していません。 os.system、subprocess.callも試しましたが、まだ動作していません。 少なくとも、実行時間にmodels.pyを変更できないようですが、何が問題なのか分かりません...

何人か考えてみませんか?

ありがとうございました。

答えて

1

モデル(およびその他のPythonコード)はサーバーの起動時にのみロードされるため、Webサーバーの実行中にmodels.pyを変更することはできません。

+0

本当にわかりません。私はサーバーが短時間ごとにモデルに相談していると思う。 私は今しようとしています: subprocess.Popen( "python2.7 /path/manage.py inspectdb> /path/app/models1.py"、shell = True) subprocess.Popen( "mv/path/models1。 py /path/models.py "、shell = True) これは時々動作しています。私はサーバーがコンサルティングモデルであり、外部コマンドが同時にオーバーライティングされているとします。ウェブがクラッシュし、モデルが空になりますが、別の時に動作します(サーバーのコンサルティングと一致しないときに再び推測します)... –

+1

いいえモデルは起動時にのみロードされます。たぶんあなたはあなたが達成したいことを説明します。おそらく、より良い/より簡単な解決策があります。 – ilse2005

+0

さて、誰かがddbbを変更する(消去、追加、テーブルの変更など)、いつもモデルを更新したいのですが、この変更はWebに反映されます(Webは常に起動されます) –

1

あなたには2つの部分があります: a)ビュー機能が呼び出されたときにシェルが何かをしたいようにします。私はすでに警報を鳴らしている。 b)新しいモデルを読み込みたい。それは起こりません。新しいコードを読み込むためにリロードする必要があります(モデルのイントロスペクトなど)。おそらくあなたはrunserverコマンドを使用して、Djangoオートレコーダーのコードを見てください:https://github.com/django/django/blob/master/django/utils/autoreload.py

何かが変更されたときにgen_filenames()によってリストされたファイルを追跡してリロードします。モデルにはリストされていないので、コードの変更は反映されません。

リロードを強制するために、何かに触れたり.pycファイルを削除したりします。

+0

私はオートローダをチェックしますが、私は必要ではありません。 私はカスタムDjango管理者を作ったので、必要な特定のコードでmodels.pyとadmin.pyを生成するためinspectdbをオーバーライドします。さらに、誰かがddbbスキーマを変更すると(MySQLによる)、新しいmodels.pyとadmin.pyをdinamically生成したいので、その変更はサーバを停止することなくWebに反映されます(これはいつも起動されるべきです)。 最後に、私はサーバーを停止し、新しいinspectdbを起動し、それらの変更をWebに反映させるためにサーバーを再度起動します。 とにかく、あなたの助けにperoksidに感謝します。歓声メイト。 –

関連する問題