「pythonフレームワーク Flaskで学ぶWebアプリケーションのしくみと作り方」を学習中です。
p.34の「1-2-6 ルート追加のしくみを考える」で、リストを使ったルーティングを試したところ一部のページでアクセスエラーが発生してしまいました。
実現したいこと
http://localhost:8000/
http://localhost:8000/index
http://localhost:8000/next
にアクセスした際にそのhtmlページを呼び出し、表示させたい。
それ以外のページにアクセスした際にはエラーを出してほしい。
発生する症状
pathを「/」にしたときはindex.htmlが表示されるが、「/index」「/next」のときに404エラーで「nothing matches the given URI.」と表示される。
この参考書の一つ前のステップでは、if文でpathごとにself.index()やself.next()など設定しており、ここまではうまくいっていました。
該当のコード
python
1from urllib.parse import urlparse 2from http.server import BaseHTTPRequestHandler, HTTPServer 3 4# load html file. 5with open ('index.html', mode='r') as f: 6 index = f.read() 7with open ('next.html', mode='r') as f: 8 next = f.read() 9 10routes = [] 11 12def route(path, method): 13 routes.append((path, method)) 14 15# add route setting. 16route('/', 'index') 17route('/index', 'index') 18route('/next', 'next') 19 20class HelloServerHandler(BaseHTTPRequestHandler): 21 22 def do_GET(self): 23 global routes 24 _url = urlparse(self.path) 25 for r in routes: 26 if (r[0] == _url.path): 27 eval('self.' + r[1] + '()') 28 break; 29 else: 30 self.error() 31 return 32 33 # index action. 34 def index(self): 35 self.send_response(200) 36 self.end_headers() 37 html = index.format( 38 title='Hello', 39 message='ようこそ、HTTPServerの世界へ!!' 40 ) 41 self.wfile.write(html.encode('utf-8')) 42 return 43 44 # next action. 45 def next(self): 46 self.send_response(200) 47 self.end_headers() 48 html = next.format( 49 message='this is next page.', 50 data='{\n data:"this is data."\n}' 51 ) 52 self.wfile.write(html.encode('utf-8')) 53 return 54 55 # erro action. 56 def error(self): 57 self.send_error(404, "CANNOT ACCESS!!") 58 return 59 60HTTPServer(('',8000),HelloServerHandler).serve_forever()
考えられる原因
リストに3つのタプルがきちんと入っていない
調べたこと・試したこと
Pythonのappend()でリストに要素を追加する | HEADBOOST
appendはリストにしか使えないことはわかったのですが、今回の場合はタプルとして入れている訳では無さそうだったのでわかりませんでした。
関連するソースコード
▼index.html
html
1<!doctype html> 2<html lang="ja"> 3 4<head> 5 <title>{title}</title> 6 <meta charset="utf-8"/> 7 <style> 8 body {{margin:10px;}} 9 h1 {{color:lightgray;font-size:36pt;}} 10 p {{font-size:16pt;}} 11 </style> 12</head> 13 14<body> 15 <h1>{title}</h1> 16 <p>{message}</p> 17</body> 18</html>
▼next.html
html
1<!doctype html> 2<html lang="ja"> 3 4<head> 5 <title>Next</title> 6 <meta charset="utf-8"/> 7 <style> 8 body {{margin:10px;}} 9 h1 {{text-align: right;}} 10 p {{font-size:14pt;}} 11 pre {{background-color:aliceblue;}} 12 </style> 13</head> 14 15<body> 16 <h1>Next Page</h1> 17 <p>{message}</p> 18 <pre>{data}</pre> 19</body> 20</html>
利用環境
python 3.8.3
独学・初心者のためわかりにくいところもあるかと思います。
足りない情報があれば追記しますので、何卒よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。