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

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

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

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

HTML

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

Q&A

解決済

Pythonでのデータ保持、再利用について

nemotonkatu
nemotonkatu

総合スコア18

Python

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

HTML

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

1回答

0グッド

1クリップ

424閲覧

投稿2022/11/02 06:38

編集2022/11/02 12:39

前提

vscodeを使って、Pythonでwebアプリケーションを作成しています。
一度入力してもらったデータを保持して、他のデータ保存に作成したいです。

python

1 2return render_template('login.html', data = data) 3@egamipro.route('/result', methods=["POST"]) 4def egamipro_post(): 5 con = get_db() 6 bangou = request.form["bangou"] 7 name = request.form["name"] 8 password = request.form["password"] 9 cur = con.execute("select count(*) from user where クラス番号=? and 名前=? and パスワード=?" ,(bangou,name,password)) 10 data = cur.fetchall()

ここで受け取った変数を別のHTMLに送信したいです。
また、開始時間と終了時間だけを更新したいです。

実現したいこと

入力して変数に保存された値を、同じpyファイルの中で使用したい。

既に保存されている情報を認証し、そのレコードの開始時間、終了時間だけを更新したい。

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

している問題・エラーメッセージ

発生

BadRequestKeyError
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
KeyError: 'bangou'
(@egamipro.route('/jikan', methods=["POST"])
def jikan_post():
# テンプレートから新規登録する商品名と値段を取得
bangou = request.form["bangou"])
のbangou=request.form["bangou"]を消すと波線が出ます。
エラーメッセージ

HTML

<!DOCTYPE html> <html lang="jp"> <head> <meta charset="UTF-8"> <title>僕たちは不当に労働させられています</title> </head> <body>
<form action='/jikan'> <p><新規登録></p> <label for="time">開始時間:</label>
<input type="time" id="time" name="kaisi" value="" />      <label for="time">終了日時:</label> <input type="time" id="time" name="owari" value="" />
<button type="submit" formmethod="POST">登録</button> </form>
</body> </html>
```python ソースコード import sqlite3 from flask import Flask,render_template,request,g egamipro = Flask(__name__) def get_db(): if 'db' not in g: # データベースをオープンしてFlaskのグローバル変数に保存 g.db = sqlite3.connect('EGAMIDB.db') return g.db @egamipro.route('/') def index(): # データベースを開く con = get_db() # テーブル「商品一覧」の有無を確認 cur = con.execute("select count(*) from sqlite_master where TYPE='table' AND name='user'") for row in cur: if row[0] == 0: # テーブル「商品一覧」がなければ作成する cur.execute("CREATE TABLE user(クラス番号 TEXT PRIMARY KEY,名前 TEXT NOT NULL,パスワード TEXT NOT NULL,開始日時 TEXT,終了日時 TEXT,メッセージ TEXT,ラズパイID INTEGER)") # レコードを作る # 商品一覧を読み込み cur = con.execute("select * from user") data = cur.fetchall() con.close() return render_template('login.html', data = data) @egamipro.route('/result', methods=["POST"]) def egamipro_post(): con = get_db() bangou = request.form["bangou"] name = request.form["name"] password = request.form["password"] cur = con.execute("select count(*) from user where クラス番号=? and 名前=? and パスワード=?" ,(bangou,name,password)) data = cur.fetchall() if data[0][0] == 0: return render_template('err.html') else: return render_template('menyu.html',data=data) @egamipro.route('/day', methods=["POST"]) def day_post(): # テンプレートから新規登録する商品名と値段を取得 return render_template('jikan.html') @egamipro.route('/jikan', methods=["POST"]) def jikan_post(): # テンプレートから新規登録する商品名と値段を取得 bangou = request.form["bangou"] name = request.form["name"] password = request.form["password"] kaisi = request.form["kaisi"] owari = request.form["owari"] # データベースを開く con = get_db() # 登録処理 sql = "INSERT INTO user(クラス番号,名前,パスワード,開始日時,終了日時)values('{}','{}','{}','{}','{}')".format(bangou,name,password,kaisi,owari) con.execute(sql) con.commit() # 一覧再読み込み cur = con.execute("select * from user order by クラス番号") data = cur.fetchall() con.close() return render_template('jikan.html', data = data) @egamipro.route('/kanri', methods=["POST"]) def kanri_post(): # データベースを開く con = get_db() # テーブル「商品一覧」の有無を確認 cur = con.execute("select count(*) from sqlite_master where TYPE='table' AND name='KanrisyaLOGIN'") for row in cur: if row[0] == 0: # テーブル「商品一覧」がなければ作成する cur.execute("CREATE TABLE KanrisyaLOGIN(ID TEXT , パスワード INTEGER)") # レコードを作る cur.execute( """INSERT INTO KanrisyaLOGIN(ID, パスワード) values(10, 123456) """) con.commit() # 商品一覧を読み込み cur = con.execute("select * from KanrisyaLOGIN") data = cur.fetchall() con.close() return render_template('index_K.html', data = data) @egamipro.route('/result_K', methods=["POST"]) def result_Kpost(): con = get_db() id = request.form["id"] password = request.form["password"] cur = con.execute("select count(*) from KanrisyaLOGIN where id=? and パスワード=?" ,(id,password)) data = cur.fetchall() if data[0][0] == 0: return render_template('err.html') else: return render_template('kanrimenyu.html',data=data) if __name__ == '__main__': egamipro.debug = True egamipro.run(host='localhost')

試したこと

セッションの保持、変数でのデータ保持

補足情報(FW/ツールのバージョンなど)

vscode
ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/11/02 06:49依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

m.ts10806

2022/11/02 06:51

ちなみにリクエストに含むための基本事項はご存じでしょうか? (Pythonに限らずWebアプリケーションでは共通の仕様です) 1つ前の質問でのやり取りから理解されていると思ったのですが、 https://teratail.com/questions/5tlgl63pkp5ue2 ここで引っ掛かっているということは理解されてないように見えます。
m.ts10806

2022/11/02 06:53

あと、質問本文の後半、コードブロックが食ってしまってるので調整してください。 コードブロックにはコードのみを(可能ならファイル毎にコードブロック分けて欲しい) https://teratail.com/questions/238564
nemotonkatu

2022/11/02 07:14

今まではjavaで開発していたので、変数の受け渡しを理解しているつもりでしたが、pythonでの理解度が足りなかったことは重々承知しているので、勉強していこうと思います。的外れな質問だったようで申し訳ありません。 コードブロック変更しました、具体例も添えて頂き理解しやすかったです。ありがとうございました。
m.ts10806

2022/11/02 07:50

変数ではないです。リクエスト送信についてです。
BeatStar

2022/11/02 07:58

「前提」のところのコードもコードブロックでやったほうがいいですよ。 そのままだと読む気失せてしまいますので…。
nemotonkatu

2022/11/02 12:30

分りました、ありがとうございます。

回答1

2

ベストアンサー

HTMLのform送信によって送信されるリクエストは、そのformに所属する入力コントロールのname属性の属性値をキーとして構成され、value属性の属性値がそのキーの値として設定されます。

つまり、name属性がない入力コントロールの情報は送信されませんし、
formに所属しない入力コントロールの入力値や選択値が送信されることはありません。
※JavaScriptなどでSUBMITまでに動的に追加されていれば送信されます

提示されているformにはkaisiとowariしかありません。
つまり、それ以外の情報は送信されません。
Pythonとして提示されているコードではリクエスト構成に含まれていないキーを参照しようとしているように見受けられます。

※これはサーバサイドの言語に関係なくWebアプリケーションとしての仕様です。

投稿2022/11/02 07:54

編集2022/11/02 07:55
m.ts10806

総合スコア80038

spoofy_dragon, ps_aux_grep👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

nemotonkatu

2022/11/02 12:37

ありがとうございます。 前提としては、一度「login.html」から変数をとり、その次の処理(jikan.html)でも活用したいと考えています。 「login.html」の処理で一度受け取った「bangou」を代入しているので、同じpyファイル内でなら活用できるのではないかと模索した結果「jikan.html」ではname属性をつけていませんでした。 一度「@egamipro.route('/result', methods=["POST"])」の処理で「bangou」,「name」,「passwprd」は受け取っているのですが、もう一度「jikan.html」で入力してもらうしか方法はないでしょうか。 拙い日本語で分かりにくく、申し訳ありません。 一度
m.ts10806

2022/11/02 20:35

type=hiddenに保持しておくとか。
nemotonkatu

2022/11/04 00:47

やはり、毎回受け渡すしか方法はないですかね。python内で維持し続けることが難しそうならそれで保持してみます、回答ありがとうございました。
m.ts10806

2022/11/04 00:54

セッションに保持するという手もあります。 適切に破棄しないといけませんが。
nemotonkatu

2022/11/04 03:05

セッションだと、ファイル毎の受け渡しになってしまったので断念してしまいました。 python、def関数同士での値の受け渡しをしたいと考えていたので・・・。すみません、助言ありがとうございます。
m.ts10806

2022/11/04 03:09

サーバサイドセッションなら同一ドメイン同一端末において共通ではないかと。
nemotonkatu

2022/11/04 03:18

勉強不足で申し訳ないのですが、javaだとjspを使ってcookieを使っていたのですが、pythonでもcookieは使えるのでしょうか。
m.ts10806

2022/11/04 03:23

Webの仕組みなので言語は無関係です。
nemotonkatu

2022/11/04 09:41

すみません、pythonファイル内でデータを保持し続けることは厳しいのでしょうか
m.ts10806

2022/11/04 11:47

元々、Python「ファイル」自体に保持することはないかと。(Pythonに限らないですが) メモリとかキャッシュの世界です。
nemotonkatu

2022/11/06 08:26

無知ですみません、javaなどは変数に代入して、別のjavaファイルで送受信していたので、HTMLでのデータ送受信に疎くて質問してしまいました。 ご教授頂きありがとうごさいます!
m.ts10806

2022/11/06 09:43

そもそもJavaのときも「ファイル」に対しては送受信していません。 リクエストマッピングされたJavaプログラムがリクエストを受け取っているもので、 Pythonのrequestsライブラリ相当のものが、Javaではサーブレット関係の機能が担っている状態。 つまり、概念は同じです。もともとの理解が正しくないのだと思います。
nemotonkatu

2022/11/06 15:20

すみません、ありがとうございます。 では、javaのサーブレットがpythonで言うところのrequestsライブラリになるという認識で間違いないでしょうか。 ご指摘の通り、言語の動く概念など理解が足りていませんでした、すみませんり
m.ts10806

2022/11/06 20:19

全く同じかどうかは別ですが、同等の機能はあるのではと(サーブレットも機能の集合体なので、その中の一機能かもしれませんが)

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

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

HTML

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