acokikoy's notes

ぐずなじぶんに焦らない。ひとつずつ丁寧に定着させる。

Python のWebフレームワーク「Responder」の勉強 (1)

Python のWebフレームワーク「Responder」をチュートリアルで勉強したログ。その1。
A familiar HTTP Service Framework — responder 1.3.0 documentation

import responder

api = responder.API()

# hello, world! - http://127.0.0.1:5042
@api.route("/")
def hello_world(req, resp):
    resp.text = "hello, world!"


# Accept Route Arguments - http://127.0.0.1:5042/hello/acokikoy
# URLから受け取った値で処理を変える
@api.route("/hello/{greeting}")
async def greet_world(req, resp, *, greeting):
    resp.text = f"Hello, {greeting}!"


# Returning JSON / YAML - http://127.0.0.1:5042/hello_json/acokikoy
@api.route("/hello_json/{who}")
def hello_to(req, resp, *, who):
    resp.media = {"type": "json", "hello": who, }


# Rendering a Template - http://127.0.0.1:5042/hello_html/acokikoy
@api.route("/hello_html/{who}")
def hello_html(req, resp, *, who):
    resp.html = api.template('hello.html', who=who)


if __name__ == '__main__':
    # Run the Server
    # デフォルトのポート番号は5042。引数 port=5000 で変更可能。
    api.run()

サーバ起動

api.run()

でサーバが起動する。

上記コードを、tut01.py で保存したら、ターミナルから、

$ python tut01.py

とするとサーバが起動してターミナルにはこんな風にログが表示される。 停止するには Ctrl+C する。

$ python tut01.py
INFO: Started server process [67676]
INFO: Waiting for application startup.
INFO: Uvicorn running on http://127.0.0.1:5042 (Press CTRL+C to quit)

ブラウザで http://127.0.0.1:5042 にアクセスすると、「hello, world!」とresp.textで渡した値が表示される。ターミナルにもログが吐かれる。

INFO: ('127.0.0.1', 62562) - "GET / HTTP/1.1" 200

ポート番号は、port=5000 のように引数指定することで変更可能。
サーバを再起動すると、今度は http://localhost:5000/ で「hello, world!」と表示される。

api.run(port=5000)`

URLから受け取った値で処理を変える

@api.route("/hello/{greeting}")
async def greet_world(req, resp, *, greeting):
    resp.text = f"Hello, {greeting}!"

と書くと、URLの{greeting}部分のパスを、引数として受け取って、f文字列ちっくに扱える。

例えば、

http://localhost:5042/hello/acokikoy

にアクセスすると、「Hello, acokikoy!」と表示される。 おぉっ (^o^)

ターミナルのログ INFO: ('127.0.0.1', 63529) - "GET /hello/acokikoy HTTP/1.1" 200

JSONYAMLを返す

JSONを返したい時は、resp.media に値をセットする。

# Returning JSON / YAML - http://127.0.0.1:5042/hello_json/acokikoy
@api.route("/hello_json/{who}")
def hello_to(req, resp, *, who):
    resp.media = {"type": "json", "hello": who, }

Rendering a Template

api.template でテンプレが使える。特に追加のモジュールをimportする必要はない。 テンプレファイルは、templates/ 配下に保存する。 htmlテンプレ中に、pythonからの値を埋め込むには {{変数名}} とする。flaskと同じ。

# Rendering a Template - http://127.0.0.1:5042/hello_html/acokikoy
@api.route("/hello_html/{who}")
def hello_html(req, resp, *, who):
    resp.html = api.template('hello.html', tmpl_who=who)

テンプレ templates/hello.html 側

<!-- templates/hello.html -->
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <title>hello.html by Responder</title>
   <link rel="stylesheet" href="">
</head>
<body>
<div>
    <h1>Hi! <span style="color:red">{{tmpl_who}}.</span> I'm Responder.</h1>
    <p><img src="https://python-responder.org/en/latest/_static/responder.png" height="800">
</div>
</body>
</html>

http://localhost:5042/hello_html/acokikoy

にアクセスするとこんな感じででる。

f:id:acokikoy:20190317220114p:plain
hello_html_by_Responder

今日はここまで。