Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【python3】cgiで一度生成したwebページのクエリ文字列を改変して、もう一度cgiを走らせたい

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



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


解決は、一度cgiで生成されるURLをうまく使ってできた
cgipythonを走らせたときのURLは

みたいな感じになってると思う

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に対して、パラメーターの一部を置き換えるような置換をしてあげればいい


自分好みに置換したクエリ文字列が例えば

だとして(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関連の内容が見れる
なにかに使えるかもしれないのでメモ

ランキング参加中です

↓クリックしていただけると嬉しいです〜