概要
Pythonでは、コマンドラインからモジュールを実行することで簡易的なWebサーバを起動できる。
Markdownファイルだった場合はhtmlに変換して、簡易mdビューアとして使用したい。
方法
Python3.4のhttp.server.py 内のSimpleHTTPRequestHandlerを継承し、send_headメソッドをオーバーライドした。
変更箇所は以下。他の部分は元のsend_headをそのまま持ってきている。
if self.path.endswith('.md'):
ctype = 'text/html'
f = open(path, 'rt', encoding='utf-8-sig')
fs = os.fstat(f.fileno())
md = markdown.markdown(f.read(), extensions=['markdown.extensions.extra'])
bs = md.encode()
length = len(bs)
f = BytesIO(bs)
拡張子がmdだった場合にMarkdownを使用してhtmlに変換している。
それだけだと芸がないので、-o (open) オプションをつけると、自動でブラウザで開くようにした。
以下の関数を別スレッドで起動している。 headリクエストを投げ、200で返ってきたらサーバが起動したとみなしブラウザでページを開いている。
def boot(bind, port, filepath):
while True:
try:
con = HTTPConnection(bind, port)
con.request('HEAD', '/')
res = con.getresponse()
if res.status == 200:
webbrowser.open('http://{}:{}/{}'.format(bind, port, filepath))
break
else:
time.sleep(1)
except ConnectionRefusedError:
pass
ブラウザを開くのには標準モジュールのwebbrowserを使用している。 Python3系統で導入された、空を飛べる標準モジュール"antigravity"でも使われているものだ。 知らない人は以下を実行してみよう。
import antigravity
cgi
python3.4のhttpのモジュールのserver.pyを読んでいて気付いたのだが、いつの間にかコマンドラインから簡易CGIサーバを起動する方法が復活していた。
試しにcgi-binディレクトリを作り以下のファイルを置く。
#! /usr/bin/env python3
print("Content-Type: text/html\n\n")
print("<html><h2>Hello</h2><br>from Python3</html>")
ファイルに実行のパーミッションを付加してから、以下のコマンドでCGIサーバを起動。
python http.server --cgi
http://localhost:8000/cgi-bin/hello.py で実行。
スクリプト全文
MarkDownを表示できる簡易サーバのスクリプト全文は以下。