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

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

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

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

GET

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

Python

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

HTML

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

Q&A

解決済

1回答

6628閲覧

flaskで画面遷移をする際のリンク先の指定方法がわからない

kazuki19950107

総合スコア3

Flask

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

GET

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

Python

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

HTML

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

0グッド

0クリップ

投稿2020/06/28 20:11

編集2020/06/29 02:56

前提・実現したいこと

Pythonでflaskを用い、ログイン機能を実装したWEBアプリを作成しています。
リンクを押した時、もしくはボタンを押した時にホーム画面に戻るような機能を実装中に、以下のエラーメッセージが発生しました。

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

TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.

該当のソースコード

python

1 2@app.route('/worker/approval', methods=["GET", "POST"]) 3def okadd(): 4 return render_template("/worker/approval.html") 5 6@app.route('/worker', methods=["GET", "POST"]) 7def home(): 8 render_template("/worker/index.html") 9 10@app.route('/worker/addcustermer', methods=["GET", "POST"]) 11def addcustermer(): 12 formMember = [] 13 if(request.method == "POST"): 14 15 formMember.append(str(request.form["name"])) 16 formMember.append(str(request.form["tel"])) 17 formMember.append(str(request.form["sonota"]) 18   insert_customer(formMember[0],formMember[1],formMember[2]) 19 20 return render_template("/worker/approval.html") 21 22 else: 23 return render_template("/worker/addcustermer.html") 24 25 26

html

1 2approval.html 3 4<div class="login-form"> 5 <form action="/worker" method="GET"> 6 <button type="submit" class="btn btn-primary btn-block">戻る</button> 7 </form> 8</div> 9 10<a href="index.html">戻る</a> 11 12

試したこと

<a href="/">戻る</a>など、パスを/にすれば動く。
それ以外のパスを書くとリンク先がない旨のエラーがはかれる。

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

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

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

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

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

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

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

FiroProchainezo

2020/06/29 00:15

頑張って読もうとしたけどダメでした。 pythonはインデントが正しく無いと動きません。 コードは正しく```で囲んでください。
kazuki19950107

2020/06/29 02:58

ご指摘ありがとうございます。 コードを'''で囲むことを存じ上げませんでした。 修正いたしましたので、お手数おかけいたしますがよろしくお願いいたします。
guest

回答1

0

ベストアンサー

お願い

インデントがまだ崩れています。
また、ソースコードを提供いただく差異は、実行可能な最小限のコードを提示ください。
現状のままだとimportすら記載されておらず、htmlも提示されていないので実行できません。

実行できる環境を提示いただくと、的確なアドバイスが返ってくるようになると思います。

エラーメッセージ

該当のエラーメッセージが出そうなのは、以下を実行した場合です。

@app.route('/worker', methods=["GET", "POST"]) def home(): render_template("/worker/index.html")

エラーメッセージを読んでいただくとわかりますが、returnが足りません。

render_templateを使う場合は、他の場所と同じようにreturn render_template()としてください。

アドバイス

あとはやりたいことを実装すれば良いと思いますが、url_for()を使うと修正が楽になると思いますので、使い方を紹介します。(以下ソース参照)

動かし方は以下手順です。

  1. localhost:5000にアクセス
  2. formのidとpasswordを入力しsubmitを押す
  3. idとpasswordをprintして、approved()に移動する
  4. "approved!"を画面に表示する
root ├ app.py ├ templates └ index.html

python

1# app.py 2from flask import Flask, render_template, redirect, url_for, request 3 4app = Flask(__name__) 5 6 7@app.route('/') 8def index(): 9 return render_template('index.html') 10 11 12@app.route('/approval', methods=['POST']) 13def approval(): 14 name = request.form.get('name', None) 15 password = request.form.get('password', None) 16 print('name : {}\npassword:{}'.format(name, password)) 17 18 return redirect(url_for('approved')) 19 20 21@app.route('/approved') 22def approved(): 23 return "approved!" 24 25 26if __name__ == '__main__': 27 app.run(debug=True) 28

html

1<!-- 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 10 <h1>ログインの例</h1> 11 <div> 12 <form action="{{ url_for('approval') }}" method="POST"> 13 <label>id:<input type="text" name="name"></label><br /> 14 <label>password:<input type="text" name="password"></label><br /> 15 <input type="submit" name="submit" value="submit"> 16 17 </form> 18 </div> 19</body> 20</html>

現状のままだと、id/passwordが空でもapproved()に移動します。
ログイン処理にflask_loginを使ったり、フォームの記述にflask_wtfを使ったり、ログイン情報のチェックにflask_sqlalchemyを使ったりしてログインを作ってみてください。

投稿2020/06/29 04:44

FiroProchainezo

総合スコア2401

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

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

kazuki19950107

2020/06/29 05:12

ご教授頂きまして、ありがとうございます。 今後投稿する際はimport,html等も含め、記述したコードのみで動くような最小限のコードを記述しようと思います。 質問についてもご回答頂き、ありがとうございます。 コードを教えていただいた通り修正した結果、正常に動作するようになりました。 redirect, url_for()について自分なりに調べてみましたが、redirectを用いるとうまくパスに飛ばない事象が一気に無くなりました。 丸1日悩んでいたことが解決できました。 初めての稚拙な投稿にもご丁寧に返して頂きまして、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問