0

cgi をインポートし、アクセサ関数を作成し、変数を検索しようとする CGI スクリプトがあります。機能は次のとおりです。

cgi_form = cgi.FieldStorage()

def get_cgi(field, default=''):
    if cgi_form.has_key(field):
        return cgi_form[field].value
    else:
        return default

これはおそらく必要ありません。しかし、XHR から送信しようとしたフィールドの 1 つである電子メールに使用しようとすると、エラーが発生します。問題を引き起こすコード行は次のとおりです。

sys.stderr.write('email: ' + get_cgi('email'))

Apache ログには次のものがあります。

[Wed Aug 29 11:25:33 2012] [error] [client ::1] Traceback (most recent call last):, referer: http://localhost/professional/calendar-todo/
[Wed Aug 29 11:25:33 2012] [error] [client ::1]   File "/Users/jonathan/mirror/professional/calendar-todo/create_account.cgi", line 26, in <module>, referer: http://localhost/professional/calendar-todo/
[Wed Aug 29 11:25:33 2012] [error] [client ::1]     sys.stderr.write('email: ' + get_cgi('email')), referer: http://localhost/professional/calendar-todo/
[Wed Aug 29 11:25:33 2012] [error] [client ::1]   File "/Users/jonathan/mirror/professional/calendar-todo/create_account.cgi", line 21, in get_cgi, referer: http://localhost/professional/calendar-todo/
[Wed Aug 29 11:25:33 2012] [error] [client ::1]     if cgi_form.has_key(field):, referer: http://localhost/professional/calendar-todo/
[Wed Aug 29 11:25:33 2012] [error] [client ::1]   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/cgi.py", line 580, in has_key, referer: http://localhost/professional/calendar-todo/
[Wed Aug 29 11:25:33 2012] [error] [client ::1] TypeError: not indexable, referer: http://localhost/professional/calendar-todo/
[Wed Aug 29 11:25:33 2012] [error] [client ::1] Premature end of script headers: create_account.cgi, referer: http://localhost/professional/calendar-todo/

私がエミュレートしようとしていたクライアント側のコードは次のとおりです。

document.getElementById('create_account_button').onclick = function()
    {
    var request = new XMLHttpRequest();
    request.open('POST', 'create_account.cgi');
    request.setRequestHeader('Content-Type', 'text/plain');
    request.send('email=' + encodeURIComponent(document.getElementById('create_email').value) + '&password=' + encodeURIComponent(document.getElementById('create_password').value) +  '&password_hint=' + encodeURIComponent(document.getElementById('create_password_hint').value));
    load_from_request(request);
    return false;
    }

JavaScript で XHR に適切に送信していますか? Python では、get_cgi('email') へのデバッグ呼び出しで「TypeError: not indexable」が発生するのはなぜですか?それを修正するにはどうすればよいですか?

4

1 に答える 1

2

最初の問題は、リクエスト ヘッダーが に設定されていないことでしたrequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");。時期尚早のヘッダーの問題については、同じ概念です。データを印刷する前に、コンテンツ ヘッダーを印刷していることを確認してください。

print "Content-Type: text/html" 

通常、コンテンツ タイプの出力をコードの先頭に置きます。これは、ブラウザに送り返されるものを確認できるようにするためです。そうすれば、コード エラーが出たときに、少なくとも問題が何であるかがわかります。

于 2012-08-29T17:18:04.247 に答える