見出し画像

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と記述しアクセスすると、以下のように表示されます。

スクリーンショット 2021-03-11 185357

do_GETが呼び出されると、以下のようにしてクエリーパラメーターを変数に取り出しています。

_urldata = urlparse(self.path)
_querydata = parse_qs(_urldata)

これで、クエリーパラメーターの値が_querydataに辞書として保管されます。後は、これを引数に指定してsampleメソッドを呼び出しています。

サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪