3

明確にするために:これをApache Webサーバー経由でcgiとして実行しています。それは問題ではありません 私の質問は、Python スクリプト内のどの関数を ajax リクエスト経由で呼び出すときに実行するかを指定する方法に関するものです。

呼び出したい関数名を変数として渡すというチュートリアルを読みました。私はそれをしました。Pythonで、私は試しました

これが私のajax関数です

 $(document).ready(function() {
    $.ajax({
       url: "monStat.py",
       type: "post",
       data: {'callFunc':'isRunning'},
       success: function(response){
           $('#blurg').html(response).fadeIn(1500);
       }
    });
 });

パイソンはこちら

 def main():
      if callFunc:
           funcResp = isRunning()
      else:
           print("No function passed")

 def isRunning( process_name ):
    ''' the content ''' 
4

3 に答える 3

4

スクリプトを Web 対応にする必要があります。私は CGI を使ったことがないので、 Flaskの例を次に示します。

from flask import Flask, request

app = Flask(__name__)

@app.route('/is_running', methods=['POST'])
def isRunning():
    process_name = request.values.get('name', None)

    ''' the content '''

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)

これで、次の宛先にリクエストを送信できます/is_running:

$.ajax({
   url: "/is_running",
   type: "post",
   data: {'name': 'ls'},
   success: function(response){
       $('#blurg').html(response).fadeIn(1500);
   }
});
于 2012-12-10T20:04:39.620 に答える
1

使用している Web フレームワークの種類については言及していませんが (存在する場合)、URL の名前から、サーバー上の Python スクリプトを直接呼び出そうとしていると推測できます。

これが機能する唯一の方法は、スクリプトがCGI スクリプトmonStat.pyとして構成され、それに応じて (CGI スクリプトが実行されるように) サーバーでホストされている場合です。あなたの JavaScript は、このスクリプトに対して POST リクエストを行うことを意味しているため、Python スクリプトは POST リクエストを受け入れてから、パラメーターを読み取ってそれらに基づいて処理する必要があります。javascript で callable に文字列として名前を付けて、CGI スクリプトに何を実行するかを自動的に認識させることはできません。これは、高度な URL 処理を提供する Web フレームワークの場所です。

URL を介して通常の python スクリプトを呼び出すだけでは、うまくいきません。最も基本的な原始的なアプローチは、python CGI モジュールを使用することです。これは学習と開始には適していますが、非常に非効率的で時代遅れのアプローチです。おそらく Web フレームワークを調べる必要があります: Python WebFrameworks

アップデート

あなたが述べたように、実際にはCGIスクリプトを使用しています...
「ルーティング」は、Webフレームワークを使用するときに無料で取得できるものです。着信要求をメイン ループに取り込み、どこで処理するかを決定します。CGIのみを使用する場合は、これを自分で行う必要があります。CGI スクリプトにリクエストを行うたびに、通常のスクリプトと同じように、通常のエントリポイントで実行されます。

そのエントリポイントで、リクエストを読み取る必要があります。リクエストが POST で「is_running」を含む場合、そのリクエストをis_running()ハンドラーに転送できます。「関数名」は単なる文字列データです。リクエストを読み取って何をすべきかを判断するのは、コード次第です。

これは、いくつかの受け入れ可能なハンドラーを許可する関数にマップする、それがどのように見えるかの非常に大まかな例です:

#!/usr/bin/env python
import cgi
import cgitb
cgitb.enable()

def isRunning(form):
    print "Content-Type: text/html\n" 
    print "isRunning()"
    print form.getvalue('name') 

def _error(*args):
    print "Content-Type: text/html\n" 
    print "Error"


HANDLERS = {
    'isRunning': isRunning
}


def main():
    form = cgi.FieldStorage()

    h_name = form.getvalue('callFunc')
    handler = HANDLERS.get(h_name, _error)
    handler(form)


if __name__ == "__main__":
    main()
于 2012-12-10T20:02:38.550 に答える
0

これは始まりです:

import cgi
fs = cgi.FieldStorage()

print "Content-type: text/plain\n"
for key in fs.keys():
    print "%s = %s" % (key, fs[key].value)
于 2012-12-10T20:34:26.787 に答える