私は JavaScript/jQuery の初心者で、助けが必要です。Django アプリケーションには、2 つのフォームを含む 1 つの HTML ページがあります。最初のフォームの送信ボタンをクリックすると、それぞれの Django ビューによって Python サブプロセスが開始されます。最初のフォームのフィールドは、このサブプロセスにパラメーターを渡すためのものです。2 番目のフォームにはフィールドが含まれていません。その唯一の目的は、送信ボタンがクリックされたときに同じサブプロセスを停止することです。
フォーム送信プロセス全体がサーバー側で行われます。jQueryを使用して次の動作を実現する方法を知りたい:
- HTML ページが初めて読み込まれるときに、サブプロセスの停止ボタンを除くすべてのフォーム フィールドとボタンを有効にします (まだ停止するものがないため)。
- サブプロセスの開始ボタンをクリックすると、サブプロセスが完了するまで、フォームのフィールドとボタン自体が無効になります。同時に、サブプロセスの停止ボタンを有効にする必要があります。
- サブプロセスの停止ボタンがクリックされたら、サブプロセスが実際に終了するまで再び無効にします。サブプロセスが終了したら、手順 1 に戻ります。
一般的に、jQuery を使用してフォーム要素を無効にする方法を知っています。私の問題は、サブプロセスのステータスをjQueryに認識させる方法です。
Django ビューの関連コードは次のとおりです。
def process_main_page_forms(request):
if request.method == 'POST':
if request.POST['form-type'] == u'webpage-crawler-form':
template_context = _crawl_webpage(request)
elif request.POST['form-type'] == u'stop-crawler-form':
template_context = _stop_crawler(request)
else:
template_context = {
'webpage_crawler_form': WebPageCrawlerForm(),
'stop_crawler_form': StopCrawlerForm()}
return render(request, 'main.html', template_context)
def _crawl_webpage(request):
webpage_crawler_form = WebPageCrawlerForm(request.POST)
if webpage_crawler_form.is_valid():
url_to_crawl = webpage_crawler_form.cleaned_data['url_to_crawl']
maximum_pages_to_crawl = webpage_crawler_form.cleaned_data['maximum_pages_to_crawl']
program = 'python manage.py crawlwebpages' + ' -n ' + str(maximum_pages_to_crawl) + ' ' + url_to_crawl
p = subprocess.Popen(program.split())
template_context = {
'webpage_crawler_form': webpage_crawler_form,
'stop_crawler_form': StopCrawlerForm()}
return template_context
def _stop_crawler(request):
stop_crawler_form = StopCrawlerForm(request.POST)
if stop_crawler_form.is_valid():
with open('scrapy_crawler_process.pid', 'rb') as pidfile:
process_id = int(pidfile.read().strip())
# These are the essential lines
os.kill(process_id, signal.SIGTERM)
while True:
try:
time.sleep(10)
os.kill(process_id, 0)
except OSError:
break
print 'Crawler process terminated!'
template_context = {
'webpage_crawler_form': WebPageCrawlerForm(),
'stop_crawler_form': stop_crawler_form}
return template_context
事前にどうもありがとうございました!