1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import http.server import socketserver # ワンライナーの場合 # python –m http.server 8000 # あるいは、 # python –m http.server 8000 --cgi # この場合、内部的には以下のように処理される # https://github.com/python/cpython/blob/3.6/Lib/http/server.py ''' def test(HandlerClass=BaseHTTPRequestHandler, ServerClass=HTTPServer, protocol="HTTP/1.0", port=8000, bind=""): """Test the HTTP request handler class. This runs an HTTP server on port 8000 (or the port argument). """ server_address = (bind, port) HandlerClass.protocol_version = protocol with ServerClass(server_address, HandlerClass) as httpd: sa = httpd.socket.getsockname() serve_message = "Serving HTTP on {host} port {port} (http://{host}:{port}/) ..." print(serve_message.format(host=sa[0], port=sa[1])) try: httpd.serve_forever() except KeyboardInterrupt: print("\nKeyboard interrupt received, exiting.") sys.exit(0) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--cgi', action='store_true', help='Run as CGI Server') parser.add_argument('--bind', '-b', default='', metavar='ADDRESS', help='Specify alternate bind address ' '[default: all interfaces]') parser.add_argument('port', action='store', default=8000, type=int, nargs='?', help='Specify alternate port [default: 8000]') args = parser.parse_args() if args.cgi: handler_class = CGIHTTPRequestHandler else: handler_class = SimpleHTTPRequestHandler test(HandlerClass=handler_class, port=args.port, bind=args.bind) ''' # スクリプト内でサーバーを呼ぶ場合 -------------------------------------------------------- # 上記スクリプトを見ると、このように書ける http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler) # --cgiの場合 http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler) # または以下のようにも書ける addr = ("127.0.0.1", 8000) class handler(http.server.CGIHTTPRequestHandler): cgi_directories = ["/cgi-bin"] # handler部は以下のようにも書ける # handler = http.server.CGIHTTPRequestHandler # handler.cgi_directories = ["/cgi-bin"] httpd = http.server.HTTPServer(addr, handler) httpd.serve_forever() # ここではhttp.server.HTTPServerを利用している # http.server.HTTPServerはsocketserver.TCPServerのサブクラスであり # 以下のようにも書ける addr = ("127.0.0.1", 8000) class handler(http.server.CGIHTTPRequestHandler): cgi_directories = ["/cgi-bin"] httpd = socketserver.TCPServer(addr, handler) httpd.serve_forever() # serve_forever()はBaseServerに定義されており、TCPServerはBaseServerを継承している # 自前のハンドラーは# http.server.BaseHTTPRequestHandlerを継承してdo_xxxという名前のメソッドを実装する |
・組み込みサーバーでCGIを処理
Win10設定>アプリ>アプリと実行エイリアス
python.exeをオフにする
sysdm.cpl>詳細設定>環境変数
からパスを通す
C:\Users\mail\AppData\Local\Programs\Python
バッチファイルを作成
1 2 3 |
start python.py start http://localhost:8000/index.html exit |
バッチと同じ階層にpython.pyを作成
1 2 3 4 |
import http.server class handler(http.server.CGIHTTPRequestHandler): cgi_directories = ["/bin"] http.server.test(HandlerClass=handler) |
バッチと同じ階層にindex.htmlを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <form action="/bin/test.py?age=20" method="POST"> <input type="text" name="val"> <input type="submit" name="submit" value="送信"> </form> </body> </html> |
binファルダ以下にtest.pyを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import cgi import urllib import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') form = cgi.FieldStorage() v = form.list # name, valueをlist型 # 他にもいくつか方法がある # form.getvalue("val") # valueをstring型/複数ならlist型 # form.getfirst("val") # valueをstring型 # form.getlist("val") # valueをlist型 # form["val"] # name, valueをlist型 # form["val"].value # valueをstring型 html = ''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <p>{}</p> </body> </html> '''.format(v) print("Content-Type: text/html; charset=UTF-8") print("") print(html) |