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文字列ちっくに扱える。
例えば、
にアクセスすると、「Hello, acokikoy!」と表示される。 おぉっ (^o^)
ターミナルのログ INFO: ('127.0.0.1', 63529) - "GET /hello/acokikoy HTTP/1.1" 200
JSONやYAMLを返す
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>
にアクセスするとこんな感じででる。
今日はここまで。