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


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

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

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

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/01/04 03:29:45
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント35pt

(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にまとめたりせずベタに書いてますが、適宜対応してください。

id:sjy

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

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

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

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

(1)怪しい点

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

(2)確認方法

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

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

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

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

2010/01/04 03:26:43
id:phero No.2

回答回数55ベストアンサー獲得回数9

ポイント35pt

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

まずは 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行を追加してみてください。

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


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

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

id:sjy

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

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

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

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

2010/01/04 03:26:35
  • id:sjy
    >kn1967様、phero様
    回答ありがとうございます。
    今すぐ開きたいのですが、ポイントが足りずまだ開けずにおります。
    ポイントを1月1日にイーバンク銀行から購入したのですが、まだ反映されておりません。
    今しばらくお待ちください。

    >kn1967様
    別件ではお世話になっております。
    あなたに恨みがあるとかではないので念のため。
    「インターネットの使用法」についての実験も兼ねています。
  • id:kn1967
    オープンせずに他で回答しておられるので正直不信感をいだいていたのですが、
    そういった事情でしたか・・・あれぇ?ポイントが足りなくても質問出来たの?
    それとも、質問後に別の事でポイントを使ってしまって足りなくなったの?

    いずれにしても、それがまかり通るとなればポイント管理部分のシステムとしては、
    正常な状態とは言えないので、はてなスタッフに対応してもらわないといけないね。


    別件の方だけど、実験なら、自分のサイトでやったら?
    M$がいちいち小物を相手にしないだろうって読みは外れてはいないと思うけど、
    逆切れで挑発し返してるようにとしか読めないと思うよ。
    実験は別にして、これからも、はてなユーザーで居続けるなら不都合じゃない?

    これを機に消えるってのなら、別段止めはしないと言いたいとこだけど、
    あちらの質問を立てた人の立場に立ってみれば?
  • id:sjy
    >kn1967
    私は初めに50ポイント持っており、質問後残ったポイントは0でした。
    その後、ポイントはクレカで買えば良いものを、注意書きを見過ごしイーバンクで買ってしまいました。
    その結果、「数日」回答をオープンできなくなってしまいました。
    完全に私の過失です。不信感を与えてしまい、大変申し訳ありません。
    以後、十分に気をつけます。

    別件の方ですが、質問を立てた方には大変申し訳ないと思っております。
    それでは、こちらに場所を移しましょう。
  • id:sjy
    >kn1967様
    実際のところはMSに聞けばすぐ分かるところでしょう。
    ならばそれまでの時間、少し遊びませんか。
    問題があるかないか、賭けましょう。

    私は「ない」に賭けました。あなたはどちらに賭けますか?
    賭け事はお嫌いですか。
    なあに、ただの遊びです。
    別に負けたからといって何も代償はいりません。

    「ある」の回答でMSに訴えられて戦うことになったら私が面倒なことになるだけです。
    2828見守っていてください。

    賢い方はリスクの少ない「ある」に賭けるか、参加しないことでしょう。
    あなたはどちらに賭けますか?
    「ある」か「ない」か「賭けない」または「答えない」か。

    kn1967様以外の参加者もお待ちしております。
    他の2人の回答者様、もし私たちが負け、MSに訴えられたらどうしましょう・・・。
    私は訴えられたらブログを作って経過を報告しようかと思っております。
    きっと多くのブクマを頂戴でき、はてな界隈を少しは楽しませることができることでしょう。
    ネットって、そういうものだと私は思っています。

    以上、回答には責任を持ちたいためにコメント欄にて釈明させて頂きました。
  • id:kn1967
    http://hatenaquestion.g.hatena.ne.jp/keyword/%e8%b3%aa%e5%95%8f%e3%81%99%e3%82%8b#question

    5件まで受付の設定だから100ポイントは担保として拘束する必要があるはずなのに、
    50ポイントで質問できてしまうというシステムは問題ですね。
  • id:kn1967
    >実際のところはMSに聞けばすぐ分かる

    話はそれほど簡単な事ではなく、思いのほか難しい。

    「Microsoft社に明確な返答を求める必要がある」と私は書いているのだが、
    具体的にどのようにすれば良いのかを書いていない点にはお気づきだろうか?
    さらに後のほうで「明言を避ける」と言った意味も・・・。

    OEM版やDSP版のサポートや保証はシステムビルダー側が行う必要性があるため、
    システムビルダー以外の個人や企業がMicrosoft社に直接問い合わせる手段は、
    実は存在しない。

    さらに、Microsoft社が公式回答を用意していないような事柄については、
    返答が来るまでにどのくらいの時間がかかるか判らない。

    私の推測でしかないが、あちらで質問をされておられる方のスキルは、
    相当に高いものだと思われ、それらの点も既に判った上での質問であろう。

    すなわち、「回答が無い事が回答」という事になるべき質問であったという事。

    さて・・・、
    賭けなどという事は無駄な手間だと、そろそろお気づきいただけただろうか?
    どうするかを決めるのは、あなたですが、私のコメントが、
    単純に不良回答者を叩くというだけでなく、後から見た人(はてなへの新規投稿は、
    かなりの確率でgoogle検索結果上位に上る)に誤解を広めないためにもあると、
    理解していただけると嬉しく思う。
    ※叩くとすれば不適当な回答を繰り返す他の2名が主ではあるが・・・。

    以上、気持ちが伝われば良いのだが・・・。
  • id:phero
    kn1967さんのFieldStorageの使い方についてですが、
    >|python|
    if f.has_key('username') and f['username'].value != '':
    user = f['username'].value
    else:
    user = 'no data'
    ||<


    これは以下のようにした方がキレイかもしれませんので、ご参考までに。
    >|python|
    user = f.getfirst('username', 'no data')
    ||<
    動作内容は微妙に異なりますが、
    getfirst()やgetlist()を使った方がコードが短くなりますので、お勧めです。
  • id:sjy
    気持ち、発言の意図は理解しました。

    ただ、一点気になる点があります。
    以下、先のコメント欄から引用したkn1967様の質問です。
    まずは、落ち着いて再度お読みください。

    >>
    Microsoft社から訴えられる可能性もよくよく考えてみてください。
    あれだけの長大な企業を相手に裁判で勝てる気があるなら、
    放置しても良いと思いますが、謝罪するなり、訂正するなら今のうちです。
    (間違いや勘違いは誰にでもありますから、早期訂正すれば、
     それ以上追求されることはあまりないでしょう。)

    もしくは、
    真に法的に問題無しという事であれば、証拠を示してみてください。
    個人で即座に構築/文書作成できるブログなどではなく、
    法的に責任を取ってくれそうな公のものにしてくださいね。
    <<

    >>
    とりあえず、
    回答した3者がどのような釈明or謝罪をコメント欄に書き込んでくるか、
    あるいは、来ないかを見させてもらいましょうか・・・。

    質問の終了期限は、あと6日もあるのですから・・・。
    (どうせ答えられないだろうから、
     即座にキャンセルって手もあるとは思うけどね。)
    <<

    >>
    M$がいちいち小物を相手にしないだろうって読みは外れてはいないと思うけど、
    逆切れで挑発し返してるようにとしか読めないと思うよ。
    実験は別にして、これからも、はてなユーザーで居続けるなら不都合じゃない?

    これを機に消えるってのなら、別段止めはしないと言いたいとこだけど、
    <<

    >>
    後から見た人(はてなへの新規投稿は、
    かなりの確率でgoogle検索結果上位に上る)に誤解を広めないためにもあると、
    理解していただけると嬉しく思う。
    ※叩くとすれば不適当な回答を繰り返す他の2名が主ではあるが・・・。
    <<

    あなたは、「不適当な回答をする輩」に
    感情的に                        ・・・(1)
    現実では誤りの可能性が高い(現実的ではない)情報を与え ・・・(2)
    一般の回答者が見ていて不快に思う「イヤラシイ」発言   ・・・(3)

    をなさっていたのです。そのことにお気づきでしょうか?
    どの部分が該当するか、分からないというのであればお聞き下さい。示します。
    貴方ほどのレベルの方ならば、もっとスマートかつ効果的な回答・コメントができたはずです。

    私はまだまだ初心者ですが、初心者だからこそはてなの世界を中立的に見ることができていると思います。
    「誤情報の氾濫」を防ぎ、はてなに平和を取り戻そうとされている貴方(貴方に限らず、正義感の強い一部の高レベル者)が、逆に程度の差こそあれど、意図せずにはてなの治安の悪化を助長している。
    そう感じております。

    心にゆとりを取り戻して下さい。

    以上、気持ちが伝われば幸いです。
  • id:sjy
    >phero様
    なるほど、単純化でミスも減りそうですね。
    参考にさせていただきます。
    どうもありがとうございます。
  • id:kn1967
    一時的にしか利用する事のないユーザーに対して、
    行間を読めってのも無理な話なのは理解している。

    ゆえに、目立つ行為で表現している訳ではあるのだが、
    当然ながら、反感も買う事になる事も理解はしている。

    これは、真の意味での「必要悪」だと思っているのだが、
    それが「単なる悪」を助長しているというのであれば、
    違うという事なのだろう。

    奇麗事だけで事態を収拾する術があれば、それは知りたいし、
    実行していきたいと思うのだが、残念ながら、そこまではスキル及ばず。
    「併せ呑むほどの余裕がまだ無い」
    http://q.hatena.ne.jp/1262015792/244280/#i244301

    正常化を願いすぎるが為の行為が悪とみなされ、悪となり、
    正義の使者に倒されるという悲しき怪人のパターンになってしまう前に、
    投稿を止めるとするか・・・。  じゃ、さよなら、みなさん。
    (ポイントゲッターとして帰ってきたりして、微笑)
  • id:rouge_2008
    良回答者がいなくなったら、質問者が困ります。(^-^;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません