忍者ブログ
日々の研究生活のメモ書きなど
やりたいことはcgi+pythonで、submitしてページが遷移した後に、そのページ生成に使ったパラメーターを少し変えてページの再生成がしたい
出力されたページにhtmlでボタンを用意しておいて、そのボタンを押すと少しだけ異なるパラメーターで同様のcgiが走るようにしたい





最初はformに入っているパラメーターをなんとか保持して、それをhtmlのformに代入しようかと思ったけど
formに入れるべき変数の数が20個くらいあって
それを全てパースするのは骨が折れる上に、もし変数が追加されたらそのパースする部分もまた編集しないといけないのでめんどくさい・・・
(一応formに隠れて変数を渡すのはhiddenってタイプを使えばできることは確認した)


解決は、一度cgiで生成されるURLをうまく使ってできた
cgiでpythonを走らせたときのURLは
http://coffee.guhaw.com/cgi-bin/my_good_script.py?para1=12345&para2=67890&date=2020/05/07
みたいな感じになってると思う

pythonで
import cgi
import cgitb

cgitb.enable()
form = cgi.FieldStorage()
って書くと、このformにURLの?以降が代入されてパースできるようになる

?以降の para1=12345&para2=67890&date=2020/05/07 はクエリ文字列と呼ばれる
この言葉で検索してると、このクエリ文字列を取得してそれをパースする方法がわかった

■ 参考 : PythonCGIでGETメソッド取得
import os
import cgi
if 'QUERY_STRING' in os.environ:
query = cgi.parse_qs(os.environ['QUERY_STRING'])
else:
query = {}
#ここまでおまじない

a = int(query['a'][0]) #データaを整数として読み込む
b = int(query['b'][0]) #データbを整数として読み込む
自分がしたかったのはクエリ文字列をそのまま取ってくることだったので、
str_query = os.environ['QUERY_STRING']
みたいにすればOK

このstr_queryに対して、パラメーターの一部を置き換えるような置換をしてあげればいい
文字数がわかってるときの任意の置換は↓の記事を参照

■ 参考 : 【python3】re.sub()で文字数が決まった任意の文字列を置換する


自分好みに置換したクエリ文字列が例えば
http://coffee.guhaw.com/cgi-bin/my_good_script.py?para1=12345&para2=99999&date=2020/05/7
だとして(2番目のpara2ってのの値が違う)
あとは生成したwebページにこのURLへのリンクを用意しておけばOK
それをクリックしたら、ほぼ同じパラメーターでcgiが動く
できたwebページにいくと、また同様にリンクがあるはず






今回は関係なかったけど、
str_query = os.environ['QUERY_STRING']
とかで、クエリ文字列を全部持ってきてからそれをパースする(分解して処理する)ときは以下の記事が参考になる

■ 参考 : PythonでURLのクエリ文字列(パラメータ)を取得・作成・変更


import urllib.parse
すると、いろんな関数が使えるようになる

ただ、cgiのクエリ文字列の場合はcgiモジュールの中にいろんなパースする関数があるので、
そっちを使ったほうが便利
form.getvalue("hoge")
form.getfirst("hoge")
とか

■ 参考 : 21.2. cgi --- CGI (ゲートウェイインタフェース規格) のサポート





余談やけど、
cgi.print_form(form)
とか
print(os.environ)
打つと、form関連の内容が見れる
なにかに使えるかもしれないのでメモ









PR
この記事にコメントする
Name
Title
Color
E-Mail
URL
Comment
Password   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "生きてます"
print "コロナのせいで15万くらい損失出してますが、生きてます"

# 最終更新 2020/03/15
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

とある物理の院生日誌~院生は社会へ旅立った~
(研究室の先輩の個人ブログ)

英語例文を見て自然に英語・英会話を学ぶ
(楠本慶ニさんの個人ページ、様々な情報の密度の高さに感動)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]