4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python + Tornado で湯婆婆を実装してみる

Posted at

はじめに

原作者様: Javaで湯婆婆を実装してみる - Qiita
色々な言語での実装: 【毎日自動更新】湯婆婆 LGTMランキング! - Qiita

この「令和のHello World!」もプログラミング言語単体だと出尽くし感があるので、今度はWebアプリケーションフレームワークを使ってブラウザで動くデモを作ってみます。
今回は Python 3 + Tornado の組み合わせで作ります。

Tornado Web Server — Tornado 6.1 documentation

検証環境

  • Windows 10 Home 2004
  • Cygwin
  • Python 3.6.10
  • Tornado 6.1

事前準備

Tornadoをインストールしておいてください。

$ pip3 install tornado

コード

yubaba.py
import random
import tornado.ioloop
import tornado.web
import tornado.template

class MainHandler(tornado.web.RequestHandler):
    _template = tornado.template.Template("""<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Yubaba</title>
</head>
<body>
  <p>契約書だよ。そこに名前を書きな。</p>
  <form action="/" method="POST">
    <input name="name" size="30" value="{{name}}">
    <input type="submit" value="送信">
  </form>
{% if name != "" %}
  <p>
    フン。{{name}}というのかい。贅沢な名だねぇ。<br>
    今からお前の名前は{{newName}}だ。いいかい、{{newName}}だよ。分かったら返事をするんだ、{{newName}}!!
  </p>
{% end %}
</body>
</html>
""")

    def get(self):
        self.set_header("Content-Type", "text/html")
        self.write(self._template.generate(name=""))

    def post(self):
        name = self.get_body_argument("name")
        newName = random.choice(name)
        self.set_header("Content-Type", "text/html")
        self.write(self._template.generate(name=name, newName=newName))
    
if __name__ == "__main__":
    app = tornado.web.Application([
        (r"/", MainHandler),
    ])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
  • HTMLフォームと湯婆婆のメッセージを書いたHTMLをテンプレートとして用意しておきます。
  • HTTPのGETメソッドとPOSTメソッドを実装します。
    • GETのときは最初のセリフとHTMLフォームだけを出力します。
    • POSTのときは↑に加えて、指定された名前から1文字ランダムに選んで新しい名前を作り、発表します。

動作例

$ python3 yubaba.py

ターミナルには何も出ませんが、これでWebサーバが起動して8888番ポートで待ち受けるので、ブラウザで http://localhost:8888/ にアクセスします。
image.png
名前を入れて「送信」を押すと
image.png
こうなります。

Python 3.3以降であれば「𠮷田」さんにも問題なく対応します。
関連: [Python] うちの湯婆婆が「𠮷田」さんに対応しているか知りたい - Qiita
image.png

お約束

名前を何も書かずに送信すると落ちます。もはや伝統芸
image.png
このときのターミナルの様子がこちら。
image.png

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?