今さらPython3 (63) - Web、bottleとか
第9章に突入。
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
telnetでゴニョゴニョするあたりは、本題とあまり関係ないので省略。(一応コマンドは叩いてみたけどね)
Python標準のWeb Library
httpとurllibという2つのパッケージにまとまっているんですね。
>>> import urllib.request as ur >>> url = 'https://raw.githubusercontent.com/koki0702/introducing-python/master/dummy_api/fortune_cookie_random1.txt' >>> conn = ur.urlopen(url) >>> print(conn) <http.client.HTTPResponse object at 0x104f50048> >>>
レスポンスが戻ってくるまでのちょっとした時間が、何やら通信している感じがするね。HTTPResponseのドキュメントによると、Read()でbodyを返すとあるので、これを試す。
21.12. http.client — HTTP protocol client — Python 3.5.1 documentation
>>> data = conn.read() >>> print(data) b'You will be surprised by a loud noise.\\r\\n\\n[codehappy] http://iheartquotes.com/fortune/show/20447\n' >>>
ステータスを見る。
>>> print(conn.status) 200
200が正常というのは自分でも知っている。ホットな話題としては、こんなのもあったね。
>> print(conn.getheader('Content-Type')) text/plain; charset=utf-8
何があるんだよ?と思ったら、これをやれば良い。
>>> for key, value in conn.getheaders(): ... print(key, value) ... Content-Security-Policy default-src 'none' X-XSS-Protection 1; mode=block X-Frame-Options deny X-Content-Type-Options nosniff Strict-Transport-Security max-age=31536000 ETag "eea0cb5830ed402a56a2ac014699cc3fb9478f36" Content-Type text/plain; charset=utf-8 Cache-Control max-age=300 X-GitHub-Request-Id 2BF9481F:6923:26541E97:567CB862 Content-Length 99 Accept-Ranges bytes Date Fri, 25 Dec 2015 03:30:43 GMT Via 1.1 varnish Connection close X-Served-By cache-nrt6127-NRT X-Cache MISS X-Cache-Hits 0 Vary Authorization,Accept-Encoding Access-Control-Allow-Origin * X-Fastly-Request-ID 1daaaf46c5e026b591382e9bddaf88baf462cce7 Expires Fri, 25 Dec 2015 03:35:43 GMT Source-Age 0 >>>
requests
サードパーティ製のrequestsの方が便利とのことなので、早速インストール。
$ pip3 install requests Collecting requests Downloading requests-2.9.1-py2.py3-none-any.whl (501kB) 100% |████████████████████████████████| 503kB 945kB/s Installing collected packages: requests Successfully installed requests-2.9.1
第1章の始めの頃でやっているので、インストール済だったかも。
>>> import requests >>> url = 'https://raw.githubusercontent.com/koki0702/introducing-python/master/dummy_api/fortune_cookie_random2.txt' >>> resp = requests.get(url) >>> resp <Response [200]> >>> print(resp.text) I know that there are people who do not love their fellow man, and I people like that! -- Tom Lehrer, Satirist and Professor [codehappy] http://iheartquotes.com/fortune/show/21465 >>>
さっきと同じ事をrequestsを使ってやってみたところ。こっちのほうが多少シンプルということね。
Pythonのwebサーバー
$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 ...
これが一番お手軽なやつね。ブラウザ開いてhttp://localhost:8000で開くと、こんな感じ。
127.0.0.1 - - [25/Dec/2015 14:04:26] "GET / HTTP/1.1" 200 -
サーバのログにも残るのね。--になっているところは、ユーザ名が分かった場合にはユーザ名で置き換えられる。アクセス日時、送られた情報、さらにステータスコードが返ってくる。
127.0.0.1 - - [25/Dec/2015 14:07:26] "GET /Pictures/ HTTP/1.1" 200 - 127.0.0.1 - - [25/Dec/2015 14:07:35] "GET /Pictures/For%20Blog/ HTTP/1.1" 200 - 127.0.0.1 - - [25/Dec/2015 14:07:36] "GET /Pictures/For%20Blog/IMG_0619.jpg HTTP/1.1" 200 -
パスをたどって、Pictures/For Blogにある写真をクリックしたところまでログが残っているのがわかる。
言っても、これは簡単なテスト目的に使うというのは明らかだね。
WSGIそしてBottle
Webフレームワークの中で、Bottleを試す。
$ pip3 install bottle Collecting bottle Downloading bottle-0.12.9.tar.gz (69kB) 100% |████████████████████████████████| 69kB 3.5MB/s Installing collected packages: bottle Running setup.py install for bottle Successfully installed bottle-0.12.9
以下のようなファイルを作って、bottol1.pyとして保存。
$ python3 bottle1.py
これで起動してから、http://localhost:9999にアクセスすると、returnの中にある1行コメントだけ表示されるてな具合。routeはデコレータとして起動していて、最後のrunが実際にwebサーバーを起動しているんだね。他に何も起動してないので、さっきのPythonが持っているwebサーバーだと思われる。
続いてのパターンは、index.htmlというファイルを呼び出すんですね。分かります。
$ python3 bottle2.py
これで起動してから、http://localhost:9999にアクセスすると、
かなり小さなimprovementですが、褒められて伸びるタイプなんですね。
続いては、bottle3.pyというファイルを作って保存。
$ python3 bottle3.py
http://localhost:9999/echo/Mothraにアクセス。
Goroに変えると、ちゃんと五郎ちゃんへの挨拶になる。これを見ると、@route()の引数の役割も分かるね。
最後にbottle3.pyのテストを書きます。
さっきのbottle3.pyのセッションをそのままにしたまま、別のセッションでこんなコマンドを打つ。
$ python3 bottle_test.py It worked! That almost never happens!
ちゃんと動いたね。というコメントが出て、テストは成功ということになる。dubug=Trueなどは試してみたけど、見た目の違いがよく分からなかった。そのうち再トライするつもり。
これはドキュメント。
(つづく)