Symfoware

Symfowareについての考察blog

Python 簡易アプリケーションサーバーを作る(BaseHTTPServer)

※Python 2系で試しています。
Python 3ではBaseHTTPServerからhttp.serverに変更されているそうです。

Pythonでグラフィカルな画面を作るのがちょっと面倒だったので、
ブラウザにお願いしようと思います。

bottleフレームワークとかを同梱してもよいのですが、
表示したい内容はすごく簡単です。
Pythonの標準機能だけでできないか試してみました。


BaseHTTPServer



BaseHTTPServer
これを使えば簡単に実装できそうです。

こちらが非常に参考になりました。
BaseHTTPServer – web サーバを実装するベースクラス




サンプル



http://localhost:8000/にアクセスすると、適当なhtmlを表示するサンプルです。

BaseHTTPServer.BaseHTTPRequestHandlerを継承したクラスを作成。
do_GETメソッドを実装すればOK。


  1. # -*- coding:utf-8 -*-
  2. import BaseHTTPServer
  3. class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  4.     def do_GET(self):
  5.         
  6.         # faviconのリクエストは無視
  7.         if self.path.endswith('favicon.ico'):
  8.             return;
  9.         
  10.         self.send_response(200)
  11.         self.end_headers()
  12.         
  13.         html = """
  14. <html>
  15. <head>
  16.     <title>BaseHTTPServer sample</title>
  17. </head>
  18. <body>
  19.     hello world!
  20. </body>
  21. </html>"""
  22.         
  23.         self.wfile.write(html)
  24. server_address = ('', 8000)
  25. httpd = BaseHTTPServer.HTTPServer(server_address, MyHandler)
  26. httpd.serve_forever()




いい感じです。

520_01.png





ユニコードオブジェクト



日本語を表示しようと、htmlをユニコードオブジェクトで定義しました。


  1.         html = u"""
  2. <html>
  3. <head>
  4.     <title>BaseHTTPServer sample</title>
  5. </head>
  6. <body>
  7.     日本語でこんにちは!
  8. </body>
  9. </html>"""




こんなエラーになります。


Exception happened during processing of request from ('127.0.0.1', 37754)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__
    self.handle()
File "/usr/lib/python2.7/BaseHTTPServer.py", line 340, in handle
    self.handle_one_request()
File "/usr/lib/python2.7/BaseHTTPServer.py", line 328, in handle_one_request
    method()
File "sample.py", line 25, in do_GET
    self.wfile.write(html)
File "/usr/lib/python2.7/socket.py", line 316, in write
    data = str(data) # XXX Should really reject non-string non-buffers
UnicodeEncodeError: 'ascii' codec can't encode characters in position 75-84: ordinal not in range(128)





ユニコードオブジェクトにせず、通常の文字列とするか、


  1.         html = """
  2. <html>
  3. <head>
  4.     <title>BaseHTTPServer sample</title>
  5. </head>
  6. <body>
  7.     日本語でこんにちは!
  8. </body>
  9. </html>"""






ちゃんとエンコードしてやります。


  1.         html = u"""
  2. <html>
  3. <head>
  4.     <title>BaseHTTPServer sample</title>
  5. </head>
  6. <body>
  7.     日本語でこんにちは!
  8. </body>
  9. </html>"""
  10.         
  11.         self.wfile.write(html.encode('utf-8'))



520_02.png


これ、お手軽でいいです。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/12/23(火) 11:42:59|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<お手軽にLinuxサーバー負荷をチェックするsimple-load-monitoring | ホーム | 遅延環境変数の展開を行わずforループ内で変数を参照する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1573-49461f69
この記事にトラックバックする(FC2ブログユーザー)