PythonでUNIXドメインソケットを使ったHTTPサーバーとクライアントを作る

Pythonでプロセス間通信をしたい、プロトコルはHTTPで、データフォーマットはJSON。なるべく1つのスクリプトファイルでサーバーやクライアントを提供したい。

こんな感じの要件。

元々Flaskが使われてるプロジェクトだったので、Flaskで全部やればいいかーと思ってました。

しかし、WerkzeugがUNIXドメインソケットに対応していなかったので、Waitressを使うことにしました。

クライアント側はRequrestsを使おうとしたけど、そちらも追加のコードが必要でした。

これはrequests-unixsocketという都合のいいパッケージがあったので使いました。

Pythonのバージョンは3.6。

ソースコード

requirements.txt

flask
waitress
requests
requests-unixsocket

server.py

from waitress import serve
from flask import Flask, jsonify

app = Flask(__name__)


@app.route('/endpoint/')
def index():
    return jsonify({'result': 'OK'})


def main():
    serve(app, unix_socket='/tmp/app.sock')


if __name__ == '__main__':
    main()

client.py

import requests_unixsocket


def main():
    session = requests_unixsocket.Session()
    resp = session.get('http+unix://%2ftmp%2fapp.sock/endpoint/')
    print(resp.json())


if __name__ == '__main__':
    main()

実行結果

server

(venv) $ python server.py
Serving on http://unix:/tmp/app.sock

client

(venv) $ python client.py
{'result': 'OK'}

便利ですね。