質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1405閲覧

flask get postについて

aoiriyu0406

総合スコア54

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/02/15 05:18

編集2022/02/15 05:31

bmi.html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>じゃんけん何出す?</title> 6 <link rel="stylesheet" href="../static/style1.css"> 7 </head> 8 <body> 9 <article> 10 <h1>何を出す?</h1> 11 <h3>あなたの手</h3> 12 <a href="/result/gu"><img src="../static/img/gu.png" alt="グー"></a> 13 <a href="/result/ch"><img src="../static/img/ch.png" alt="チョキ"></a> 14 <a href="/result/pa"><img src="../static/img/pa.png" alt="パー"></a> 15 </form> 16 </article> 17 </body> 18</html>

bmi→resultに行くためのcss.py

1@app.route('/result/<hand>', methods) 2def result(hand): 3 hands=['グー', 'チョキ', 'パー'] 4 shouhai=['あいこ', '負け', '勝ち'] 5 c=randint(0,2) 6 cpu=hands[c] 7 kekka='' 8 my='' 9 if hand=='gu': 10 my=hands[0] 11 if cpu=='グー': 12 kekka=shouhai[0] 13 elif cpu=='チョキ': 14 kekka=shouhai[2] 15 elif cpu=='パー': 16 kekka=shouhai[1] 17 elif hand=='ch': 18 my=hands[1] 19 if cpu=='グー': 20 kekka=shouhai[1] 21 elif cpu=='チョキ': 22 kekka=shouhai[0] 23 elif cpu=='パー': 24 kekka=shouhai[2] 25 elif hand=='pa': 26 my=hands[2] 27 if cpu=='グー': 28 kekka=shouhai[2] 29 elif cpu=='チョキ': 30 kekka=shouhai[1] 31 elif cpu=='パー': 32 kekka=shouhai[0] 33 34 return render_template('result.html', my=my, cpu=cpu, kekka=kekka)

result.html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>じゃんけん結果</title> 6 <link rel="stylesheet" href ="../static/style2.css"> 7 </head> 8 <body> 9 <ul><h5></h5> 10 結果を見に行くときは↓↓をクリックしてね<br> 11 <a href="./result1.html"><img src="../static/img/upa.png" alt="結果を見る"></a> 12 </h5></ul> 13 <article> 14 <div> 15 <form action="result1" method="post"> 16 <dl> 17 <h1>出した手は・・・</h1> 18 あなたの手:{{ my }}         敵の手:{{ cpu }} 19 20 {% if my=='グー' and cpu=='グー' %} 21 <p><img src="../static/img/gu.png" alt="グー">  VS  <img src="../static/img/gu.png" alt="グー"></p> 22 {% elif my=='グー' and cpu=='チョキ' %} 23 <p><img src="../static/img/gu.png" alt="グー">  VS  <img src="../static/img/ch.png" alt="チョキ"></p> 24 {% elif my=='グー' and cpu=='パー' %} 25 <p><img src="../static/img/gu.png" alt="グー">  VS  <img src="../static/img/pa.png" alt="パー"></p> 26 27 {% elif my=='チョキ' and cpu=='グー' %} 28 <p><img src="../static/img/ch.png" alt="チョキ">  VS  <img src="../static/img/gu.png" alt="グー"></p> 29 {% elif my=='チョキ' and cpu=='チョキ' %} 30 <p><img src="../static/img/ch.png" alt="チョキ">  VS  <img src="../static/img/ch.png" alt="チョキ"></p> 31 {% elif my=='チョキ' and cpu=='パー' %} 32 <p><img src="../static/img/ch.png" alt="チョキ">  VS  <img src="../static/img/pa.png" alt="パー"></p> 33 34 {% elif my=='パー' and cpu=='グー' %} 35 <p><img src="../static/img/pa.png" alt="パー">  VS  <img src="../static/img/gu.png" alt="グー"></p> 36 {% elif my=='パー' and cpu=='チョキ' %} 37 <p><img src="../static/img/pa.png" alt="パー">  VS  <img src="../static/img/ch.png" alt="チョキ"></p> 38 {% elif my=='パー' and cpu=='パー' %} 39 <p><img src="../static/img/pa.png" alt="パー">  VS  <img src="../static/img/pa.png" alt="パー"></p> 40 {% endif %} 41 </dl> 42 </form> 43 </div> 44 </article> 45 </body> 46</html>

result.htmlの勝敗の結果を出した手をは別に表記させたいと思っています。
そこで、getとpostで区別しようと思っているのですが、やり方がわかりません。
postとgetに分けてはみたもののpostしか動かず。どうしたらgetがうごきますか?
また、postとgetの分け方はあっているのでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問をよく読み返す事をお勧めします。
「getとpostを区別しようと思っているがやり方がわからない」「postとgetに分けてはみたもののpostしか動かない」は両立しません。

さて、それだけでは回答にならないので、

メソッドを変更したい場合、以下にあるような書き方が可能です。
https://flask.palletsprojects.com/en/2.0.x/quickstart/#the-request-object

python

1@app.route('/login', methods=['POST', 'GET']) 2def login():

これは、 login() がPOSTメソッドとGETメソッドでアクセスされることを意味します。
aoiriyu0406さんのコードでは @app.route('/result/<hand>', methods) と記載されていますが、(質問文では)methodsは定義されておらず、プログラムを実行することができません。

python

1@app.route('/login') 2def login():

上記の様に書いた場合、GETメソッドだけが許可されているのと同じ意味になります。(以下と同じ)

python

1@app.route('/login', methods=['GET']) 2def login():

POSTとGETを分けたい場合は、以下の様に関数を別にするか

python

1@app.route('/login', methods=['GET']) 2def login1(): 3 4@app.route('/login', methods=['POST']) 5def login2():

メソッドによって処理を分ける方法が考えられます。

python

1# 既存のimportに追加 2from flask import request 3 4 5@app.route('/login', methods=['POST', 'GET']) 6def login(): 7 if request.method == 'GET': 8 # GETの場合の処理 9 elif request.method == 'POST': 10 # POSTの場合の処理

postしか動かず。どうしたらgetがうごきますか?

とありますが、postが動いている理由が掲載コードからは理解できません。

html

1 <a href="/result/gu"><img src="../static/img/gu.png" alt="グー"></a> 2 <a href="/result/ch"><img src="../static/img/ch.png" alt="チョキ"></a> 3 <a href="/result/pa"><img src="../static/img/pa.png" alt="パー"></a>

たぶんこちらのリンクから移動するのを前提で質問されていると思いますが、a要素のリンクをクリックした場合のメソッドはGETです。
POSTではアクセスされません。
質問文のコードとは別のコードを試していませんか?

a要素でPOSTさせる場合、以下のリンクのような動作が必要のはずです。
https://qiita.com/next1ka2u/items/9736ce2f9c7f3aa69d61

GETを動かしたい場合は、GETメソッドでアクセスしてください。
POSTを動かしたい場合も同様です。
HTTPではrequestとresponseは1対1です。
GETメソッドでrequestした結果がGETとPOSTの結果2つであることはあり得ません。

なので、じゃんけんの手をPOSTで送って、結果として「出した手と勝敗」の2つを受け取りたい場合は、POSTのresponseとして「出した手と勝敗」を返して下さい。

2022/02/18追記

<form method='POST'>や<form method='GET'>をhtmlの方で書くと思うのですが、そのmethodと、pythonで書く@app.route('/login', methods=['POST', 'GET'])は関係ないのでしょうか??

formのmethodはそれを使ってHTTPリクエストすると言う意味で、
flask側のmethodはそのメソットの場合の処理という感じの意味なので、
リンクしているわけではありませんから、関係あることはあるし、無いと言えば無いという感じの回答になると思います。

リンクさせているのは、そのように設計したプログラマだったりで、ブラウザとサーバが勝手に良い感じにリンクしてくれるわけではありません。

htmlにmethod='POST'しか書いていないのにelif request.method == 'GET':がTrueになるコードを見たのですが、どうしてそうなるのでしょうか?
私の中では、<form>で囲ったインプット(HTMLのinput type='submit'とかinput type='text')は、formで書いたメソッド(GETなたGET,POSTならPOST)でいくものだと思っていたのですが、違うのでしょうか??

ドキュメントを探したのですが、明確なドキュメントが見当たらなかったので「ここに書いてあるとおり」とはできませんが、 <a> 要素を使ったハイパーリンクの場合、GETメソッドでアクセスされます。

例えば、以下のコードを使うとします。

htmlを見ると、formの中に <a> <input> <button> があるのがわかります。

aoiriyu0406さんさんの考えでは、action='post' が指定されているformの中にあるリンクは、全てそのメソッドでrequestしてくれるのではないかと思いますが、実際には異なります。

<a> の場合はGET。
<input> の場合はPOST。
<button> の場合はPOSTとなります。

python

1from flask import Flask, request, render_template 2 3app = Flask(__name__) 4 5 6@app.route('/', methods=['POST', 'GET']) 7def index(): 8 if request.method == 'GET': 9 print('get') 10 else: 11 print('not get') 12 13 return render_template('index.html') 14 15 16if __name__ == '__main__': 17 app.run()

html

1{# index.html #} 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7</head> 8<body> 9 10 <form method="post" action="{{ url_for('index') }}"> 11 <a href="{{ url_for('index') }}">element a</a> 12 <input type="submit" name='myhand' value="input"> 13 <button type="submit" name="myhand" value="button">button</button> 14 15 </form> 16</body> 17</html>

メソッドが気になる場合は、ブラウザ付属の開発者ツールを使って、Networkを確認すると良いかもしれません。

投稿2022/02/17 03:07

編集2022/02/18 06:48
FiroProchainezo

総合スコア2401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoiriyu0406

2022/02/17 05:04

詳しくありがとうございます。 <form method='POST'>や<form method='GET'>をhtmlの方で書くと思うのですが、そのmethodと、pythonで書く@app.route('/login', methods=['POST', 'GET'])は関係ないのでしょうか?? htmlにmethod='POST'しか書いていないのにelif request.method == 'GET':がTrueになるコードを見たのですが、どうしてそうなるのでしょうか? 私の中では、<form>で囲ったインプット(HTMLのinput type='submit'とかinput type='text')は、formで書いたメソッド(GETなたGET,POSTならPOST)でいくものだと思っていたのですが、違うのでしょうか??
aoiriyu0406

2022/02/18 07:13

詳しくありがとうございます。 納得することができました! 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問