0

私は JavaScript/jQuery の初心者で、助けが必要です。Django アプリケーションには、2 つのフォームを含む 1 つの HTML ページがあります。最初のフォームの送信ボタンをクリックすると、それぞれの Django ビューによって Python サブプロセスが開始されます。最初のフォームのフィールドは、このサブプロセスにパラメーターを渡すためのものです。2 番目のフォームにはフィールドが含まれていません。その唯一の目的は、送信ボタンがクリックされたときに同じサブプロセスを停止することです。

フォーム送信プロセス全体がサーバー側で行われます。jQueryを使用して次の動作を実現する方法を知りたい:

  1. HTML ページが初めて読み込まれるときに、サブプロセスの停止ボタンを除くすべてのフォーム フィールドとボタンを有効にします (まだ停止するものがないため)。
  2. サブプロセスの開始ボタンをクリックすると、サブプロセスが完了するまで、フォームのフィールドとボタン自体が無効になります。同時に、サブプロセスの停止ボタンを有効にする必要があります。
  3. サブプロセスの停止ボタンがクリックされたら、サブプロセスが実際に終了するまで再び無効にします。サブプロセスが終了したら、手順 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

事前にどうもありがとうございました!

4

2 に答える 2

0

まず、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リクエストに詳細を入力する必要がありますが、役立つかもしれないと思います。

于 2012-11-19T17:08:58.460 に答える
0

サブプロセスをdjangoビューへのAjaxリクエストとして起動することを検討します。Ajaxリクエストを起動するときに、JSメソッドを呼び出してすべての要素を無効にします。

ビューが処理を終了すると、Ajax 呼び出しを行った Javascript に応答が返されます。JavaScript がこの応答を受信したら、すべてのフォーム要素を再度有効にします。

これにより、Django からの Ajax レスポンスを介して、プロセスの結果に関するエラー/メッセージをクライアントに送信することもできます。

あなたの状況を正しく理解できたと思います。

于 2012-11-16T00:11:46.377 に答える