0

まず第一に、私のサーバーは Python 以外の追加のフレームワークを受け入れないので、それに固執する必要があります。インターネットで簡単な例を見つけました。私は ajax の知識がほとんどなく、助けが必要です。まず、このサンプル perl コードを python に変換するには、python の cgi モジュールと "w" の getvalue を使用する必要がありますか? 第二に、ボタンで送信するのではなく、時間間隔で ajax 部分をリロードするには、html 部分のどこを変更する必要がありますか?

HTML:

<html>
<head>
<title>Simple Ajax Example</title>
<script language="Javascript">
function xmlhttpPost(strURL) {
var xmlHttpReq = false;
var self = this;
// Mozilla/Safari
if (window.XMLHttpRequest) {
    self.xmlHttpReq = new XMLHttpRequest();
}
// IE
else if (window.ActiveXObject) {
    self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
self.xmlHttpReq.open('POST', strURL, true);
self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
self.xmlHttpReq.onreadystatechange = function() {
    if (self.xmlHttpReq.readyState == 4) {
        updatepage(self.xmlHttpReq.responseText);
    }
}
self.xmlHttpReq.send(getquerystring());
}

function getquerystring() {
var form     = document.forms['f1'];
var word = form.word.value;
qstr = 'w=' + escape(word);  // NOTE: no '?' before querystring
return qstr;
}

function updatepage(str){
document.getElementById("result").innerHTML = str;
}
</script>
</head>
<body>
<form name="f1">
<p>word: <input name="word" type="text">  
<input value="Go" type="button" onclick='JavaScript:xmlhttpPost("/cgi-bin/simple-ajax-    example.cgi")'></p>
<div id="result"></div>
</form>
</body>
</html>

CG部分:

#!/usr/bin/perl -w
use CGI;

$query = new CGI;

$secretword = $query->param('w');
$remotehost = $query->remote_host();

print $query->header;
print "<p>The secret word is <b>$secretword</b> and your IP is <b>$remotehost</b>.</p>"

上記の perl コード (cgi) の私の Python 解釈:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cgi

myform = cgi.FieldStorage()
recieved = myform.getvalue('word')

print '<p> Hi mate, %s' % recieved

少なくともあなたの答えは間隔の問題で私を助けました;しかし、私はまだPythonの部分を理解する必要があります.Pythonコードでgetvalue('w')またはgetvalue('word')を使用してフォームから値を取得する必要があります。コードを実行するとエラーが発生し続けます。

4

1 に答える 1

0

第二部のみお答えします。

汚い方法:

</script>終了タグの直前:

var inv = setInterval(function () {
    xmlhttpPost("/cgi-bin/simple-ajax-example.cgi");
}, 5000);

//if you ever want to stop
//call stopPolling()
function stopPolling() {
    clearInterval(inv);
}

XMLHttpRequestオブジェクトのインスタンス化がループ内にあるため、メモリリークのシナリオにつながる可能性があるため、これはダーティです。サーバーの応答がインターバルタイマーよりも遅い場合、メモリを大量に消費するオブジェクトが作成される可能性があります。

よりクリーンな方法

  • jQueryのようなライブラリを使用する
  • ライブラリを使用できない場合は、最初にAjaxオブジェクトのインスタンス化のための関数をコーディングし、変数を適切にキャッシュして、メモリリークが発生しないようにし、同じオブジェクトを再利用するようにします。
  • サーバーの平均応答時間と予期しない遅延を考慮して、適切な間隔でポーリングします。

お役に立てれば。

于 2013-03-08T18:27:47.487 に答える