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

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

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

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

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

Q&A

0回答

875閲覧

【pythonのflaskでDBを全て削除してしまい謎のhtmlファイルに遷移する】

rintaro.shiri

総合スコア3

Flask

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

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

0グッド

0クリップ

投稿2021/06/04 04:02

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
flaskで作ってもいないhtmlのurlに遷移してブラウザ表示してしまいます。また、削除ボタンを押したらDBの該当するidのレコードだけ削除したいのですが、dbの内容が全て削除されてしまいます。
また、エラーメッセージは特になく、ブラウザにも問題なく表示されます。

お力添えいただけると、大変ありがたいです。よりしくお願いいたします。

実現したいことは、SubmitField('削除')で作った、削除ボタンを押すとその押したボタンのidを持つDBのレコードだけ消したいです。

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

ターミナルに表示されるメッセージ
[04/Jun/2021 12:36:38] "GET /delete_memo HTTP/1.1" 200 -

該当のソースコード

from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from app import app #引数にFlaskのインスタンスを渡す事でFlaskでSQLAlchemyを利用してデータベースを扱う事ができるようになります。 db = SQLAlchemy(app) migrate = Migrate(app, db) #dbのモデルを継承したクラスを定義している class Memos(db.Model): __tablename__ = 'memos' #primary_keyは、同じ値が設定されていたとしても、見分けられるようになる。 id = db.Column(db.Integer, primary_key = True) content = db.Column(db.Text) start_time = db.Column(db.Integer) end_time = db.Column(db.Integer) def __init__(self, content, start_time, end_time): self.content = content self.start_time = start_time self.end_time = end_time
from forms import CreateMemo, UploadMemo, DeleteMemo from flask import Flask, render_template, url_for, request, redirect from models import db, Memos from app import app #メモリストの表示 @app.route('/') @app.route('/memo_list') def memo_lists(): #11行目は、DBの内容を全て取得 memos = Memos.query.all() form = DeleteMemo(request.form) return render_template('memo_list.html', memos = memos, form = form) #メモ新規作成画面の表示 @app.route('/create_memo', methods = ['POST', 'GET']) def create_memo(): form = CreateMemo(request.form) if request.method == 'POST': #20〜22行目は、ユーザーが入力した内容 content = form.content.data start_time = form.start_time.data end_time = form.end_time.data #トランザクション。大丈夫だったら、ユーザーが入力した内容をDBに追加する with db.session.begin(subtransactions=True): new_memo = Memos(content, start_time, end_time) db.session.add(new_memo) db.session.commit() return redirect(url_for('memo_lists')) #postでアクセスしたときに、以下が実行される。つまり、最初は必ず下記が実行される。 return render_template('create_memo.html', form = form) #メモ更新画面の表示 @app.route('/upload_memo/<int:memo_id>', methods = ['POST', 'GET']) def upload_memo(memo_id): #request.formでフォームの内容を取得する form = UploadMemo(request.form) memo = Memos.query.get(memo_id) #対象のidを持つレコードのdbを取得 if request.method == 'POST': id = form.id.data content = form.content.data #data(値)でユーザーが入力した内容を取得。contentにユーザーが入力した値を代入している。 start_time = form.start_time.data end_time = form.end_time.data with db.session.begin(subtransactions=True): memo = Memos.query.get(id) #対象のユーザーidのレコードを全て取得 memo.content = content #DBのcontentの値にユーザーが入力した値をぶちこむ memo.start_time = start_time memo.end_time = end_time db.session.commit() return redirect(url_for('memo_lists')) return render_template('update_memo.html', memo = memo, form = form) #削除する機能の作成 @app.route('/delete_memo', methods = ['GET', 'POST']) def delete_memo(): form = DeleteMemo(request.form) if request.method == 'Post' and form.validate(): with db.session.begin(subtransactions=True): id = form.id.data memo = Memos.query.get(id) db.session.delete(memo) db.session.delete() db.session.commit() return redirect(url_for('memo_lists')) return render_template('memo_list.html') if __name__ == '__main__': app.run(debug = True)
{% extends "base.html" %} {% block content %} <div> <h1>てめえが書いたメモ一覧だぜ!!!!</h1> <a href="{{url_for('create_memo')}}">メモの作成</a> <div> <table> <tr> <th>メモ</th> <th>始まる時間</th> <th>終わる時間</th> <th>削除ボタン</th> </tr> {% for memo in memos %} <tr> <td><a href="{{url_for('upload_memo', memo_id = memo.id)}}"> {{memo.content}}</a></td> <td>{{memo.start_time}}</td> <td>{{memo.end_time}}</td> <td> <form action="{{ url_for('delete_memo') }}" method = "POST"> {{form.csrf_token}} {{form.id(value = memo.id)}} {{form.submit()}} </form> </td> </tr> {% endfor %} </table> </div> </div> {% endblock %}
#フォームを作るためのファイル from wtforms import Form from wtforms import ( TextAreaField, IntegerField, HiddenField, SubmitField ) #HiddenFieldは隠しフィールド。ブラウザ側からは見えないし、普段は表示されない class CreateMemo(Form): #新しいメモを作るためのフォーム content = TextAreaField('内容は:') start_time = IntegerField('始まる時間は:') end_time = IntegerField('終わる時間は:') submit = SubmitField('新規に作成するンゴwww') #メモを更新するためのフォーム class UploadMemo(Form): id = HiddenField() content = TextAreaField('内容は:') start_time = IntegerField('始まる時間は:') end_time = IntegerField('終わる時間は:') submit = SubmitField('更新するぜ!!!') #メモを削除するためのフォーム class DeleteMemo(Form): id = HiddenField() submit = SubmitField('削除')

試したこと

bese.htmlを元に作成したメモ一覧のhtmlファイルのformのaction属性に、idを新たに引数に追加して{{url_for('delete_memo',memo.id)}}などと追加し、viewファイルの方でもそれに準じた変更をしたが、ブラウザ表示は全く変わらなかった。

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

mac os
flask 2.0.1
python 3.9.0
Werkzeug 2.0.1

・flask_sqlalchemy
・flask_migrate
・wtforms

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

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

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

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

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

FiroProchainezo

2021/06/07 01:04

質問文に「謎のhtmlファイル」に関する記述がありませんが、「謎のhtmlファイル」が何で質問にどのように関係しているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問