新元号
1991年、
もちろん
さて、
HTTPメソッドとルーティング
前回紹介したように、
一方HTTPでは、
そのため、
1 #!/usr/bin/python
2
3 from bottle import route,run,request
4
5 @route('/login')
6 def login():
7 return '''
8 <form action="/login" method="post">
9 username: <input name="username" type="text" /> <br>
10 password: <input name="password" type="password" />
11 <input value="login" type="submit" />
12 </form>
13 '''
14
15 @route('/login', method='POST')
16 def do_login():
17 username = request.forms.get('username')
18 password = request.forms.get('password')
19 return '''
20 username: {} <br>
21 password: {}
22 '''.format(username, password)
23
24 run(host='localhost', port=8080, reloader=True, debug=True)
このスクリプトを実行し、
この画面を作っているのはPython特有の三連クォート(''')で囲まれた8~15行目までの<form>タグで、
画面に沿ってusernameとpasswordを入力し"login"ボタンを押すと、
Bottleでは、
また、
from bottle import get, post
としてgetやpostモジュールをインポートしておけば、
@get('/login')
def login:
....
@post('/login')
def do_login:
....
のようにメソッドで修飾したルーティングを書くことも可能で、
requestオブジェクト
前節のスクリプトの17、
requestオブジェクトを利用するには、
このモジュールをimportすれば、
一方、
Bottleでは、
Bottleがどのようにリクエスト・
1 #!/usr/bin/python
2
3 from bottle import route,run,request, template
4
5 @route('/check')
6 @route('/check', method='POST')
7 def key_check():
8 print("request.query:",end="")
9 print(vars(request.query))
10
11 print("request.forms:",end="")
12 print(vars(request.forms))
13
14 print("request.params:",end="")
15 print(vars(request.params))
16
17 try:
18 len(request.forms.get('r_name'))
19 r_name = request.forms.get('r_name')
20 h_name = request.forms.get('h_name')
21 return template('Hello {{name}} a.k.a. {{nick}}', name=r_name, nick=h_name)
22 except:
23 return '''
24 <form action="/check" method="post">
25 real name: <input name="r_name" type="text" /> <br>
26 handle name: <input name="h_name" type="text" />
27 <input value="send" type="submit" />
28 </form>
29 '''
30
31 run(host='localhost', port=8080, reloader=True, debug=True)
このスクリプトでは"http://
8行目から15行目は、
17行目から29行目は、
このスクリプトを起動して、
$ python sample_02.py
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
request.query:{'dict': {}}
request.forms:{'dict': {}, 'recode_unicode': True}
request.params:{'dict': {}}
127.0.0.1 - - [21/Apr/2019 12:30:36] "GET /check HTTP/1.1" 200 222
<form>タグに何かテキストを入力して送信すると、
request.query:{'dict': {}}
request.forms:{'dict': {'r_name': ['kojima'], 'h_name': ['isle']}, 'recode_unicode': True}
request.params:{'dict': {'r_name': ['kojima'], 'h_name': ['isle']}}
127.0.0.1 - - [21/Apr/2019 12:33:49] "POST /check HTTP/1.1" 200 24
一方、
request.query:{'dict': {'r_name': ['kojima'], 'h_name': ['isle']}}
request.forms:{'dict': {}, 'recode_unicode': True}
request.params:{'dict': {'r_name': ['kojima'], 'h_name': ['isle']}}
127.0.0.1 - - [21/Apr/2019 12:37:25] "GET /check?r_name=kojima&h_name=isle HTTP/1.1" 200 222
このように、
なお、
Bottleの作者、
しかしながら、
一方、
呑兵衛の筆者には、
更なる連想で、
