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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Flask

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

1回答

2753閲覧

Flask テキストファイルを読み込む関数を実行するとRecursionErrorが送出される

mireiri

総合スコア2

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Flask

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2020/09/30 13:25

Flaskを使って簡単なWebアプリを作成しております。
機能の一つに息抜きとして社内の人が毎日送ってくれる偉人たちの名言を記録したテキストファイルをランダムで表示するページを作成しております。
Flaskの本体とは別にその名言をランダムでピックアップするファイルを作り、importさせています。
/// ファイル構成 ///
TEST
├── app.py (本体ファイル)
├── words_select.py (名言抽出ファイル。app.pyにimportされる)
├── static
│ ├── words.txt (名言が書かれたファイル)
└── templates
├── index.html
└── words.html (名言を表示するページ)

app.py ~中略~ @app.route('/words') def words(): return render_template('words.html', title='Good Words', message='') @app.route('/good_words') def good_words(): sys.setrecursionlimit(2000) response = words() return render_template('words.html', title='Good Words', message=response)
words_select.py import random def words(): words = [] with open('FlaskBlog/static/words.txt', encoding='utf-8') as f: for i in f: text = i.rstrip() words.append(text) response = random.choice(words) return response
words.html {% extends "layout.html" %} {% block title %} {{title}} {% endblock %} {% block content %} <h3>前向きになる言葉が出てくるよ</h3> <button onclick="location.href='/good_words'">ここをクリックしてね</button> <br> <p>あなたへのメッセージ:{{message}}</p> <br><br> {% endblock %}

RecursionErrorが送出されるので、検索した結果を参考に import sys と sys.setrecursionlimit(2000) を
記述しているのですがうまくいきません。
setrecursionlimit(2000)を(3000)にすると「このサイトにアクセスできません」となります。

にっちもさっちもいかなくなってしまったのでご教示いただけますと幸甚です。

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

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

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

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

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

quickquip

2020/09/30 15:31 編集

"何をしたら"RecursionErrorになるのかと、app,pyのimport部分が書かれてないのが気になりました。 > words_select.py (名言抽出ファイル。app.pyにimportされる) とありますがimportされてもグローバルな名前wordsが上書きされて実際は使えないのでは? という気がします。
mireiri

2020/10/01 00:33

説明不足、申し訳ございません。ご指摘の通り同じ名前をいくつも使っていたことでおかしなことになっていたようです・・・。凡ミスでした。以後、しっかりと命名と機能を整理してコーディングします。ご指摘ありがとうございました!
guest

回答1

0

ベストアンサー

ご提示のコードを実行してみたところ、good_words()はresponseとして@app.route('/words')のHTMLを受け取っていました。

words_secret.pyをどのように読み込んでいるのかわかりません(中略部分のため)が、意図した通りに動いていない可能性があります。

以下の通り呼び出したところ、一応txtから値を取得してくれました。

from flask import Flask, render_template from words_select import words as my_words app = Flask(__name__) @app.route('/words') def words(): return render_template('words.html', title='Good Words', message='') @app.route('/good_words') def good_words(): response = my_words() return render_template('words.html', title='Good Words', message=response) if __name__ == '__main__': app.run()

同じ名前を使うのは混乱の元なので、意図的に別の名前を使ってはいかがでしょうか。
この短いプログラムでwordsが3つも出てくるのはわかりづらいです。
(/words, 'words.html', words_secret.pyのwords())

投稿2020/10/01 00:22

FiroProchainezo

総合スコア2424

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

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

mireiri

2020/10/01 00:31

名前を変えてみたら動作しました!やはり同じ名前を使いまわしていたのが原因だったようです。ご指摘の通り同じ名前を使っていることで盲目となってしまいました。ありがとうございます!以後、頂戴したアドバイスを忘れずにコーディングしていきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問