flaskで別のページを開きたい
解決したいこと
flaskで掲示板を作っています。コメントの投稿完了のページを別のhtmlファイルで作ったのですが開くことができません。
発生している問題・エラー
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
自分で試したこと
参考サイト
Python flaskで掲示板を作ってみよう2
flaskで掲示板を作っています。コメントの投稿完了のページを別のhtmlファイルで作ったのですが開くことができません。
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
参考サイト
Python flaskで掲示板を作ってみよう2
index.html
のbody
タグが閉じていないのは仕様ですか?
今回はhtml
に問題がありそうとわかりましたが、今後は問題があるのはブラウザなのか、サーバなのかわからない状況にいやというほど遭遇すると思います。
そこで、原因特定への簡単なアプローチ方法も一緒に書いときます。
htmlファイルはサーバを立てなくてもブラウザで見ることが出来ます。
方法はエクスプローラーからhtmlファイルを選択→右クリック→[プログラムから開く]→お好みのブラウザを選択、です。
ここで上手く表示出来ないならhtmlファイルに問題があり、上手く表示出来ればサーバ側(python)に問題があると分かります。
このように問題を切り分けて行くと原因特定に近づけます。
@upskill
Questioner
Method Not Allowed
つまり、/
に対してPOST
が許可されていないというエラーです。
ルーティング(参考サイトでいうbbs.py
の@app.route
)の問題だと思います。
「HTMLテンプレート」ではなくて、Pythonコードを提示してください。
(body
タグが閉じてないのが正しいかはbase.html
の内容次第です。
むしろ<head>
やら<body>
やらがあること自体がおかしい気がします。)
@upskill
Questioner
原因はすでに書いた通りで、投稿時のリクエストURLとルーティングが噛み合っていないためです。
<form action="" method="post">
...
@app.route("/result", methods=["POST"])
def result():
...
form
要素のaction
属性は空文字列、つまり相対パスとして「ここ」を指定してあるので、
投稿時のリクエストは投稿ページ自体のパスである/
に向きます。
他方で、投稿を受け付けるresult
メソッドは、
app.route
デコレータによって/result
に待ち構えるようになっています。
index.html
の方でaction="/result"
と指定すれば、当面の問題は解消します。
(実行してませんのでその他の問題がないことは保証できません)
今一度、次の点を整理しましょう。
このアプリケーションには、2つのエンドポイントがあります。
GET /
/
にアクセスしたときと、投稿結果ページで「戻る」を押したときにリクエストを発行。index
メソッドに対応。index.html
テンプレートを元に投稿ページを作成し、クライアントに返す。POST /result
result
メソッドに対応。result.html
テンプレートを元に投稿結果ページを作成し、クライアントに返す。↑のそれぞれの機能・設定がソース上のどの記述に対応するのか分かりますか?
Webアプリケーションの基本はクライアント-サーバー間のHTTPの往復です。
ブラウザの開発者ツールなどを利用して、意図通りの通信が行われていることを確認しましょう。
なお、次にQiitaにソースコードを投稿される際は、
画像ではなくコードブロックを利用した方が回答が付きやすいと思います。
HTMLテンプレートはHTMLそのものではないので、
シンタクスハイライトにはjinja
を指定します。
@upskill
Questioner