2010-12-12 12 views
2

私はスレッド内でdjangoのcall_methodを実行したいと思います。 これはサンプルコードです:スレッド内のdjangoのcall_commandに関する問題

import sys 
sys.path.append("/my/django/project/path/") 
import threading 
import time 


# Import my django project configuration settings 
from django.core.management import setup_environ 
from mydjangoprojectname import settings 
setup_environ(settings) 

from django.core.management import call_command 

class ServerStarter(threading.Thread): 
    def __init__(self): 
     super(ServerStarter, self).__init__() 
     print "ServerStarter instance created" 

    def run(self): 
     print "Starting Django Server..." 
     call_command("runserver", noreload=True) 


if __name__ == '__main__': 
    starter = ServerStarter() 
    starter.start() 

------------------------------ 
OutPut: 
ServerStarter instance created 
Starting Django Server... 
ServerStarter instance created 
Starting Django Server... 
Validating models... 
0 errors found 
Django version 1.2.3, using settings 'mydjangoprojectname.settings' 
Development server is running at http://127.0.0.1:8000/ 
Quit the server with CONTROL-C. 

Djangoのサーバーが正しく開始しますが、ServerStarterは二回を作成されます。
そして両方のServerStarterのインスタンスが実行されます。
runメソッドでcall_command( "runserver"、noreload = True)にコメントすると、
のスレッドしか作成されません。
ありがとうございます!

+0

これは非常に良い方法ではありません。ポート8000​​を使用するとどうなりますか?あるいは何か他にポート8000​​が必要な場合はどうしますか?少なくとも、セミランダムポート番号を使用してください。 –

+0

'threading'ではなく' multiprocessing'を使って同じことが起こります。 –

答えて

0

これはおそらく、Djangoの内部サーバーがすべてのモジュールを再読み込みすることが原因であると思われます。 --noreloadに相当するものがcall_command(おそらくcall_command("runserver", noreload=True)ですが、わかりません)のものを試してみてください。

(またQThread sはQApplication.exec_()によって開始されている;。あなたは以前にそれを開始するための特別な要件がない限り、私はあなたがstarter.start()を自分で実行する必要があるとは考えていない)

+0

私は質問からGUIのものを削除しました。 – ApprenticePython

5

私は解決策を見つけた(クリス・モーガンは正しかったです) 。このコードは、私が望むように動作します。

import sys 
sys.path.append("/my/django/project/path/") 
import threading 

# Import my django project configuration settings 
from django.core.management import setup_environ, ManagementUtility 

from mydjangoprojectname import settings 
setup_environ(settings) 


class ServerStarter(threading.Thread): 
    def __init__(self): 
     super(ServerStarter, self).__init__() 
     print "ServerStarter instance created" 

    def run(self): 
     print "Starting Django Server..." 
     utility = ManagementUtility() 
     command = utility.fetch_command('runserver') 
     command.execute(use_reloader=False) 


if __name__ == '__main__': 
    starter = ServerStarter() 
    starter.start() 
関連する問題