今さらPython3 (63) - Web、bottleとか

第9章に突入。

入門 Python 3

入門 Python 3

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が正常というのは自分でも知っている。ホットな話題としては、こんなのもあったね。

japan.cnet.com

>> 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で開くと、こんな感じ。

f:id:deutschina:20151225140104p:plain

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にアクセスすると、

f:id:deutschina:20151225143920p:plain

かなり小さなimprovementですが、褒められて伸びるタイプなんですね。

続いては、bottle3.pyというファイルを作って保存。

$ python3 bottle3.py

http://localhost:9999/echo/Mothraにアクセス。

f:id:deutschina:20151225144702p:plainf:id:deutschina:20151225144706p:plain

Goroに変えると、ちゃんと五郎ちゃんへの挨拶になる。これを見ると、@route()の引数の役割も分かるね。

最後にbottle3.pyのテストを書きます。

さっきのbottle3.pyのセッションをそのままにしたまま、別のセッションでこんなコマンドを打つ。

$ python3 bottle_test.py
It worked! That almost never happens!

ちゃんと動いたね。というコメントが出て、テストは成功ということになる。dubug=Trueなどは試してみたけど、見た目の違いがよく分からなかった。そのうち再トライするつもり。

bottlepy.org

これはドキュメント。

(つづく)