upskill
@upskill (学 高島)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

flaskで別のページを開きたい

解決したいこと

flaskで掲示板を作っています。コメントの投稿完了のページを別のhtmlファイルで作ったのですが開くことができません。

発生している問題・エラー

または、問題・エラーが起きている画像をここにドラッグアンドドロップ
スクリーンショット (44).png

スクリーンショット (47).png

スクリーンショット (50).png

スクリーンショット (45).png

スクリーンショット (46).png

自分で試したこと

参考サイト
Python flaskで掲示板を作ってみよう2

0

3Answer

index.htmlbodyタグが閉じていないのは仕様ですか?


今回はhtmlに問題がありそうとわかりましたが、今後は問題があるのはブラウザなのか、サーバなのかわからない状況にいやというほど遭遇すると思います。

そこで、原因特定への簡単なアプローチ方法も一緒に書いときます。

htmlファイルはサーバを立てなくてもブラウザで見ることが出来ます。
方法はエクスプローラーからhtmlファイルを選択→右クリック→[プログラムから開く]→お好みのブラウザを選択、です。

ここで上手く表示出来ないならhtmlファイルに問題があり、上手く表示出来ればサーバ側(python)に問題があると分かります。

このように問題を切り分けて行くと原因特定に近づけます。

0Like

Comments

  1. @upskill

    Questioner

    bodyタグが閉じていないのは私のミスだと思います。直しておきました。

Method Not Allowed
つまり、/に対してPOSTが許可されていないというエラーです。
ルーティング(参考サイトでいうbbs.py@app.route)の問題だと思います。

「HTMLテンプレート」ではなくて、Pythonコードを提示してください。

bodyタグが閉じてないのが正しいかはbase.htmlの内容次第です。
むしろ<head>やら<body>やらがあること自体がおかしい気がします。)

0Like

Comments

  1. @upskill

    Questioner

    Pythonコード、base.htmlの画像を更新しておきました。わかりにくくて申し訳ないです。

原因はすでに書いた通りで、投稿時のリクエストURLとルーティングが噛み合っていないためです。

index.html
<form action="" method="post">
  ...
hello.py
@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メソッドに対応。
      • 投稿をDBに保存する。
      • result.htmlテンプレートを元に投稿結果ページを作成し、クライアントに返す。

↑のそれぞれの機能・設定がソース上のどの記述に対応するのか分かりますか?

Webアプリケーションの基本はクライアント-サーバー間のHTTPの往復です。
ブラウザの開発者ツールなどを利用して、意図通りの通信が行われていることを確認しましょう。


なお、次にQiitaにソースコードを投稿される際は、
画像ではなくコードブロックを利用した方が回答が付きやすいと思います。

Markdown記法チートシート

HTMLテンプレートはHTMLそのものではないので、
シンタクスハイライトにはjinjaを指定します。

0Like

Comments

  1. @upskill

    Questioner

    うまく開くことができました。様々なことを教えてくださりありがとうございました。

Your answer might help someone💌