【Python】responder でHello, World ! 0.0.0.0をhostに指定する方法
responder でHello World! 0.0.0.0をhostに指定する方法
人間のためのイケてるPython WebFramework「responder」、そして作者のKenneth Reitzについて - フリーランチ食べたい
こちらの記事で話題になっているresponderを早速試して見ました。
Hello World ! するまでに2つひっかかったポイントがあったので、共有します。
ちなみにresponderどころかDjangoもFlaskも使ったことのない初心者なので、おかしな内容になっているかもしれません。ご容赦ください。
※2018年12月2日時点での情報です。
環境 * AWS EC2 Ubuntu Server 18.04 LTS (HVM), SSD Volume Type * Python 3.6.5
ModuleNotFoundError: No module named 'starlette.lifespan'
とりあえずこちらのクイックスタート通りにHello World ! を書いてみました。 Quick Start! — responder 1.1.2 documentation
import responder api = responder.API() @api.route("/") def hello_world(req, resp): resp.text = "hello, world!" api.run()
実行したところModuleNotFoundError: No module named 'starlette.lifespan’
というエラーが出てしまいました。
これはgithubのissueにもあげられていました。
ModuleNotFoundError: No module named ‘starlette.lifespan’ · Issue #255 · kennethreitz/responder · GitHub.
problem solved by using starlette 0.8 version
とりあえず今のところはstarletteのバージョン0.8を使えば解決するようです。
pip install starlette==0.8
hostに0.0.0.0を指定したい
ubuntu@ip-172-31-43-88:~/dev/test$ python hello.py INFO: Started server process [17400] INFO: Waiting for application startup. INFO: Uvicorn running on http://127.0.0.1:5042 (Press CTRL+C to quit)
これはEC2を開発環境にしていると毎回困ることなのですが、localhostや127.0.0.1にアクセスするのが困難です。
0.0.0.0を開くようにしないとローカルのブラウザから確認できません。
Responderのコードを読むと、どうやら環境変数として”PORT”が設定されている場合は0.0.0.0:PORTが開かれ、それでない場合は127.0.0.1:5042になるようです。
if "PORT" in os.environ: if address is None: address = "0.0.0.0" port = int(os.environ["PORT"]) if address is None: address = "127.0.0.1" if port is None: port = 5042
ということで適用にわかりやすいPORTを設定して、
ubuntu@ip-172-31-43-88:~/dev/test$ export "PORT"=10001
EC2のセキュリティグループも変更します。
そしてブラウザからアクセスすると、
Hello World ! が無事表示されました 。
ubuntu@ip-172-31-43-88:~/dev/test$ python hello.py INFO: Started server process [17405] INFO: Waiting for application startup. INFO: Uvicorn running on http://0.0.0.0:10001 (Press CTRL+C to quit) INFO: ('m.y.i.p', 53094) - "GET / HTTP/1.1" 200
追記: api.run()の引数にaddressとportを与えても同様のことができるようです。
api.run(address='0.0.0.0',port=10001)