人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PythonのCGIで、変数を cgiurl?変数=値 で渡したときの受け取りについて

【環境】
・さくらのレンタルサーバ(スタンダードプラン)
・Pythonは2.6.2
・cgiについては経験が浅い初心者。
・ファイルはutf-8(BOMなし)で保存

【質問】
現在、変数を cgiurl?変数=値で渡したとき以下のように受取っています。以下のソース(500文字制限に引っかかってしまったので画像で添付しました。申し訳ありません)で示すようにcgiurl?変数=値で渡すと、falseが、?cgiファイルの中でテスト用に直接変数に値を入れてるとtrueが出力されます

値をprintすると正常に表示されたので、値のエンコードの問題(それ以外に原因が思いつきませんでした)と考え、確かめる方法を調べていますが今だ術を見つけられていません

ここで、あなたにお聞きしたいことがあります
1.この問題でどこが、どう怪しそうに思えますか?
2.この問題の解消方法を例文などで示していただけたら幸いです

1262308172
●拡大する

●質問者: sjy
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:BOM CGI print Python UTF-8
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kn1967
●35ポイント

(1)怪しい点

query.get

私が知らないだけかもしれないけれど見たことがないので、

class定義などが必要なはずだけど、

この箇所でエラーにならないということは、

パラメータがおかしいかclassのほうがおかしいのかもしれない。


(2)確認方法

ここでテスト用に・・・の部分にて、例えば下記のような具合で、

出力させればどのようなパラメータを受け取ったかが判るはずですが、確認されましたか?

print 'Content-type: text/html;charset=UTF-8\n\n'
print '<html><body>'
print '<hr />'
print user
print '<br />'
print identity
print '<hr />'
print '</body></html>'

※困った時には、こまめにチェック用の出力を行うようにしてみてください。


(3)どうしてもダメな場合のための、別案

#!/usr/bin/python
# -*- coding: utf-8 -*-
import cgi
f = cgi.FieldStorage()
if f.has_key('username') and f['username'].value != '':
 user = f['username'].value
else:
 user = 'no data'
if f.has_key('identity') and f['identity'].value != '':
 identity = f['identity'].value
else:
 identity = 'no data'
print 'Content-type: text/html;charset=UTF-8\n\n'
print '<html><body>'
print '<hr />'
print user
print '<br />'
print identity
print '<hr />'
print '</body></html>'

※これ単体で動きますから、動作確認用にでも使ってください。

※classにまとめたりせずベタに書いてますが、適宜対応してください。

◎質問者からの返答

回答ありがとうがざいます。

問題が解決しました。原因は、c.execute(sql, (user, identify, time));という文の「identify」がスペルミスで「identity」でした。

この問題は、try ? except 節のtryの中で発生したもので、十分にtryの中をエラーチェックしなかったことがそもそものミスでした。

以降、気を付けてゆきます。

(1)怪しい点

query.getについては、query = cgi.parse()ということを事前に行っていました。ソースの転記ミスです、申し訳ありません。

(2)確認方法

XML形式の出力でしたが、同じように試していました

(3)どうしてもダメな場合のための、別案

わざわざありがとうございます。cgiで外から渡された値の受け取り方が複数あることを知りました。

テスト用にも役に立ちました。


2 ● kawasaki
●35ポイント

エラーを特定する方法をお伝えしておきます。

まずは try ? except 節を使わないように

if user:
 c = db.cursor()
 ...(略)
 print 'true'

とし、さらにファイル冒頭部分の import cgi の直前に

print 'Content-type:text/html;charset=utf-8'
print ''
import cgitb
cgitb.enable()

という4行を追加してみてください。

すると実行時にエラーの詳細が出力されることと思います。


エラーを特定後、対策方法がご不明でしたら

またご質問なりコメントなりいただければと思います。

◎質問者からの返答

回答ありがとうがざいます。

問題が解決しました。原因は、c.execute(sql, (user, identify, time));という文の「identify」がスペルミスで「identity」でした。

この問題は、try ? except 節のtryの中で発生したもので、十分にtryの中をエラーチェックしなかったことがそもそものミスでした。

今後は実行時にエラーの詳細を出したり、tryの中を特にクリーンに保つよう心がけて参ります。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ