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

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

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

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

Q&A

1回答

326閲覧

POST送受信 flaskについて

tiikk

総合スコア12

Flask

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

0グッド

0クリップ

投稿2022/06/16 11:12

編集2022/06/16 12:11

flaskで作成しています。methods=["POST"]の状態だとうまく動かずにNot foundと出ますが何も指定しないとうまく動きます。POSTと指定するのが正解だと思うのですがなぜPOSTだと動かないのでしょうか?
curlを使ってPOSTで送信してみるとhtmlが返ってきて正常に動いていると思います。
postでhtmlから送信がうまく出来ていないということでしょうか?
pythonのほうではエラー等でていませんでした。
教えてください。お願い致します。
@app.route('/insert')の場合
イメージ説明

python

1from flask import Flask, render_template, request, redirect, url_for 2from flask_sqlalchemy import SQLAlchemy 3 4app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{ 5 'user': '', 6 'password': '', 7 'host': '', 8 'db_name': '' 9}) 10app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False 11app.config['SQLALCHEMY_ECHO'] = False 12# dbの初期化 13db = SQLAlchemy(app) 14class Shohin(db.Model): 15 __tablename__ = 'Shohin' 16 id = db.Column(db.Integer, primary_key=True) 17 name = db.Column(db.Text) 18 price = db.Column(db.Integer) 19 20 21@app.route('/result', methods=['GET']) 22def result(): 23 datas = Shohin.query.all() 24 return render_template("index3.html", lists=datas) 25 26@app.route('/insert', methods=["POST"]) 27def insert(): 28 name_txt = request.form['name'] 29 price_txt = request.form['price'] 30 shohin = Shohin() 31 shohin.name = name_txt 32 shohin.price = price_txt 33 db.session.add(shohin) 34 db.session.commit() 35 return redirect("/portfolio/result") 36 37 38if __name__ == "__main__": 39 app.run(host='0.0.0.0', debug=True)

html

1<body> 2 <div> 3 <table> 4 <thead> 5 <tr> 6 <th>ID</th> 7 <th>商品名</th> 8 <th>値段</th> 9 </tr> 10 </thead> 11 <tbody> 12 {% for item in lists %} 13 <tr> 14 <th>ID</th> 15 <th>{{item.name}}</th> 16 <th>{{item.price}}</th> 17 </tr> 18 {% endfor %} 19 </tbody> 20 </table> 21 </div> 22 <form action='insert' method="POST"> 23 <p><新規登録></p> 24 <label> 25 商品名 26 <input type="text" name="name"> 27 </label> 28 <label > 29 値段 30 <input type="text" name="price"> 31 </label> 32 <button type="submit">登録</button> 33 </form> 34 35</body> 36</html>

cgi

1#! /home/ユーザーid/anaconda3/bin/python 2from sys import path 3import os 4from wsgiref.handlers import CGIHandler 5from flask_sample import app 6from werkzeug.middleware.proxy_fix import ProxyFix 7 8 9path.insert(0, '/サイト名/portfolio/') 10 11 12class ProxyFix(object): 13 def __init__(self, app): 14 self.app = app 15 16 def __call__(self, environ, start_response): 17 # ※要書き換え 18 environ['SERVER_NAME'] = "サイト名" 19 environ['SERVER_PORT'] = "80" 20 environ['REQUEST_METHOD'] = "GET" 21 environ['SCRIPT_NAME'] = "" 22 if 'PATH_INFO' not in environ: 23 environ['PATH_INFO'] = '' 24 environ['QUERY_STRING'] = "" 25 environ['SERVER_PROTOCOL'] = "HTTP/1.1" 26 return self.app(environ, start_response) 27 28 29if __name__ == '__main__': 30 app.wsgi_app = ProxyFix(app.wsgi_app) 31 CGIHandler().run(app)

htaccess

1RewriteEngine On 2RewriteCond %{REQUEST_FILENAME} !-f 3RewriteRule ^(.*)$ /portfolio/index.cgi/$1 [QSA,L]

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

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

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

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

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

guest

回答1

0

実行してみましたが、現象が再現しません。
methods=["POST"]だとNot foundが出る、とはどういった操作をした場合の現象でしょうか?

@app.route('/insert', methods=["POST"])の状態で、ブラウザのURL覧に、例えばhttp://localhost:5000/insertのようなURLを入力した場合はMethod Not Allowedと表示されるはずです。(Chrome)

実際の動作確認では、質問文のコードはそのままでは動作しないので以下を使用しました。
以下のコードを実行し、ブラウザからhttp://localhost:5000/にアクセスし、表示されたFormに値を入力して「登録」ボタンを押すと、name_txt price_txtに入力した値が入ります。

python

1# app.py 2from flask import Flask, request, render_template 3 4app = Flask(__name__) 5 6 7@app.route('/') 8def index(): 9 return render_template('index.html') 10 11 12@app.route('/insert', methods=["POST"]) 13def insert(): 14 name_txt = request.form['name'] 15 price_txt = request.form['price'] 16 # shohin = Shohin() 17 # shohin.name = name_txt 18 # shohin.price = price_txt 19 # db.session.add(shohin) 20 # db.session.commit() 21 return 'a' 22 23 24if __name__ == '__main__': 25 app.run()

html

1<!-- templates/index.html --> 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7</head> 8<body> 9<form action='insert' method="POST"> 10 <p><新規登録></p> 11 <label> 12 商品名 13 <input type="text" name="name"> 14 </label> 15 <label > 16 値段 17 <input type="text" name="price"> 18 </label> 19 <button type="submit">登録</button> 20</form> 21</body> 22</html>

Shohin()については不明ですのでなんとも言えませんが、Flask_Sqlalchemyあたりを使用しているものと思います。
db.session.commit()が正常に終了している場合はredirectが実施され、失敗している場合は500番代のエラーになるはずですので、Not Foundが表示されているという現象が再現できません。

ちなみに以下の様なコードを追加して、http://localhost:5000/testにアクセスした場合、http://localhost:5000/test2に遷移後、ブラウザ上でNot Foundが表示されます。
redirect("/portfolio/result")の遷移先が無いということはありませんか?

python

1@app.route('/test') 2def test(): 3 return redirect('/test2')

投稿2022/06/16 11:42

FiroProchainezo

総合スコア2401

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

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

tiikk

2022/06/16 11:50

回答ありがとうございます。 @app.route('/insert')とした場合だと正常に動き/portfolio/resultに遷移され結果が表示されます。 @app.route('/insert', methods=["POST"])だとPOST https://サイト名/portfolio/insert 404と出ます。
FiroProchainezo

2022/06/16 11:52

その状況をこちらで再現できないので、再現可能な最低限のコードを提供お願いいたします。
tiikk

2022/06/16 12:11

情報を追加しました。
FiroProchainezo

2022/06/16 12:32

最小限のコードをお願いしましたが、.htaccessやCGIスクリプトが含まれているようです。 ローカル環境では再現しないということでしょうか? その場合は環境依存ですので、サーバ情報を記載ください。 同じ環境を持っている人が回答してくれるかもしれません。 CGIと.htaccessはよくわかりませんが、以下の部分でGETに書き換えているのは影響ないのでしょうか? `environ['REQUEST_METHOD'] = "GET"` callがいつ呼ばれるのか不明ですが、request時に呼び出されてGETに書き換えられているならアクセスできなかったりするような気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問