Javascript 如何在Python子进程终止之前禁用表单字段和按钮?

Javascript 如何在Python子进程终止之前禁用表单字段和按钮?,javascript,jquery,python,django,subprocess,Javascript,Jquery,Python,Django,Subprocess,我是JavaScript/jQuery新手,需要一些帮助。在Django应用程序中,我有一个包含两个表单的HTML页面。单击第一个表单的submit按钮时,相应的Django视图将启动一个Python子流程。第一种形式的字段用于将参数传递到此子流程。第二个表单不包含任何字段。它的唯一用途是在单击submit按钮时停止相同的子流程 整个表单提交过程发生在服务器端。我想知道如何使用jQuery完成以下行为: 第一次加载HTML页面时,启用所有表单 除停止子流程按钮外的字段和按钮(自 没有什么可以阻止

我是JavaScript/jQuery新手,需要一些帮助。在Django应用程序中,我有一个包含两个表单的HTML页面。单击第一个表单的submit按钮时,相应的Django视图将启动一个Python子流程。第一种形式的字段用于将参数传递到此子流程。第二个表单不包含任何字段。它的唯一用途是在单击submit按钮时停止相同的子流程

整个表单提交过程发生在服务器端。我想知道如何使用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
    

    提前非常感谢

    > P>我会考虑将子进程作为Ajax请求发射到Django视图,当您启动Ajax请求时,也请调用JS方法禁用所有元素。p> 当视图完成处理时,它将返回对发出Ajax调用的Javascript的响应。当javascript收到此响应时,重新启用所有表单元素

    这将允许您通过来自Django的Ajax响应向客户机发送一些关于流程结果的错误/消息


    我希望我已经正确地理解了您的情况。

    首先,您可以设置类似于以下内容的jQuery

    $(document).ready(function() {
      $('#startButton').bind('click', startProcess());
    });
    
    var startProcess() = function {
      $('#startButton').unbind('click');
      .ajax({
        url: '',
        data: {},
        dataType: '',
        type: '',
        beforeSend: function() {
          $('#stopButton').bind('click', stopProcess());
        },
        success: function(data) {
          $('#stopButton').unbind('click');             
        },
        error: function(data) {
          // Handle error
        },
        complete: function(data) {
          $('#startButton').bind('click', startProcess());
        },
    };
    
    var stopProcess() = function {
      $('#stopButton').unbind('click');
    
      // Use AJAX to tell django to stop processing
    
      $('#startButton').bind('click', startProcess());
    };
    
    您可以让Django使用success=True进行响应,这将反过来触发success函数

    from django.utils import simplejson as json
    
    def json_response(message):
        return HttpResponse(json.dumps(dict(success=True, message=message)))
    

    编辑:我还没有测试过这个,您也必须在AJAX请求中填写详细信息,但我认为这可能会有所帮助。

    您只是在寻找如何使用jquery禁用表单元素的信息,还是需要对总体思路提供帮助?@noisewaterphd:我知道如何使用jquery禁用表单元素。我的问题是如何让jQuery知道我的子流程的状态。是的,你知道。:)你的建议听起来很合理。您可以给我一些关于如何使用Ajax请求启动Python子进程的通用伪代码吗?Ajax请求可以像处理任何其他请求一样处理,您只需要在后端上有一个视图来响应它。这将阻止服务器线程,直到该进程完成,不是吗?您需要一个异步服务器来避免阻塞。