mdファイルを表示する簡易Webサーバ

概要

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を表示できる簡易サーバのスクリプト全文は以下。

Show Comments