URLクエリーパラメーターの利用
今日は、『つくってマスターPython』の6-1 “http.serverによるサーバープログラム”で学んだことのアウトプットです。
URLクエリーパラメーターとは
アクセスの際に必要な情報を渡すのに用いられるのが「URLクエリーパラメーター」と呼ばれるものです。Googleのサイトに行くと、アドレスの後に「・・・・・?hl=ja&authuser=1&~」といった記述が表示されていることがあります。この「?」より後の部分は「クエリー文字列」と呼ばれ、このテキスト部分に記述されているパラメーターがURLクエリーパラメーターです。URLを指定してアクセスする際、?より後に以下のような形で必要な情報を付け足したものです。
・・・・・?キー=値&キー=値&・・・・・
それぞれの値にはキーがつけられています。このキーを指定することで、複数の値を渡せるようになっています。
urllib.parseモジュール
URLクエリーパラメーターの値を利用するには、urllib.parseというモジュールにある「urlparse」と「parse_qs」を利用します。これらの関数は引数に指定されたURLのテキストを各要素に分解します。
URLを分解する
urllib.parse.urlparse( URLテキスト )
クエリー文字列を分解して辞書で返す
urllib.parse.parse_sq( クエリー文字列 )
URLクエリーパラメーターの値を利用する
/sampleにアクセスしたら、idとpassというクエリーパラメーターの値を取り出して表示するプログラムは以下のようになります。HTTPServer(('',8000), HelloServerHandler).serve_forever()
from urllib.parse import urlparse, parse_qs
from http.server import BaseHTTPRequestHandler, HTTPServer
with open('index.html', mode='r') as f:
index = f.read()
with open('sample.html', mode='r') as f:
sample = f.read()
class HelloServerHandler(BaseHTTPRequestHandler):
def do_GET(self):
_urldata = urlparse(self.path)
_querydata = parse_qs(_urldata.query)
self.send_response(200) #
self.end_headers()
if _urldata.path == '/':
self.index()
elif _urldata.path == '/sample':
self.sample(_querydata)
else:
self.other()
def index(self):
self.wfile.write(index.encode('utf-8'))
return
def sample(self, params):
if 'id' in params:
_id = params['id'][0]
else:
_id = 'no id.'
if 'pass' in params:
_pass = params['pass'][0]
else:
_pass = 'no pass'
_data = '<div>ID: ' + _id + '</div>' \
'<div>PASS:' + _pass + '</div>'
html = sample.format(
title = 'サンプル',
header = 'サンプルページ',
message = 'これは、サンプルのメッセージです。' + _data
)
self.wfile.write(html.encode('utf-8'))
return
def other(self):
self.wfile.write(b'NO-PAGE!!!')
return
HTTPServer(('',8000), HelloServerHandler).serve_forever()
localhost:8000/sample?id=hanako&pass=flowerと記述しアクセスすると、以下のように表示されます。
do_GETが呼び出されると、以下のようにしてクエリーパラメーターを変数に取り出しています。
_urldata = urlparse(self.path)
_querydata = parse_qs(_urldata)
これで、クエリーパラメーターの値が_querydataに辞書として保管されます。後は、これを引数に指定してsampleメソッドを呼び出しています。
サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪