我是 JavaScript/jQuery 新手,需要一些帮助。在 Django 应用程序中,我有一个包含两个表单的 HTML 页面。当单击第一个表单的提交按钮时,相应的 Django 视图会启动一个 Python 子进程。第一种形式的字段用于将参数传递给该子流程。第二种形式不包含任何字段。它的唯一目的是在单击其提交按钮时停止相同的子进程。
整个表单提交过程发生在服务器端。我想知道如何使用 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
非常感谢您!