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

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

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

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

Python

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

Q&A

解決済

1回答

2390閲覧

flask jinja2 pipenv環境でTempateNotFoundが解消できない

rie_

総合スコア12

Flask

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

Python

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

0グッド

0クリップ

投稿2020/01/15 05:19

編集2020/01/15 08:17

既存のアプリケーションに、一つのHTML'aboutapp/info.html'を追加しました。
Wiondows環境では'aboutapp/info.html'が表示され問題ありません。
Templateの位置や、呼び出し方に問題はないと思います。

このをソースをUnix環境にアップすると、追加したHTMLのみTempateNotFoundが発生します。
pipenvが影響しているのでしょうか。

\app_init_.py

# views/auth.py from .views import auth app.register_blueprint(auth.bp, url_prefix=url_prefix_str) # views/auth.py from .views import aboutapp app.register_blueprint(aboutapp.bp, url_prefix=url_prefix_str)

\app\views\auth.py
\app\views\aboutapp.py

bp = Blueprint('aboutapp', __name__) # Blueprint登録 @bp.route('/info') @login_required def info(): """ APP情報画面を表示する """ if request.method == 'GET': # APP情報画面初期表示 return render_template('aboutapp/info.html')

\app\templates\auth\login.html
\app\templates\aboutapp\info.html

新しいディレクトリ(\app\templates\aboutapp\)と
その他の更新したファイル(init.py、aboutapp.py、aboutapp\info.html)が
アップされていることは確認しています。

エラー

[2020/01/15 13:46:23] ERROR - app.py#log_exception:1891: Exception on /test/aboutapp/info [GET]

Traceback (most recent call last):
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functionsrule.endpoint
File "/home/test/test-app/app/views/auth.py", line 142, in wrapped_view
return view(**kwargs)
File "/home/test/test-app/app/views/aboutapp.py", line 19, in info
return render_template('aboutapp/info.html', **locals())
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/templating.py", line 138, in render_template
ctx.app.jinja_env.get_or_select_template(template_name_or_list),
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/jinja2/environment.py", line 869, in get_or_select_template
return self.get_template(template_name_or_list, parent, globals)
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/jinja2/environment.py", line 830, in get_template
return self._load_template(name, self.make_globals(globals))
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/jinja2/environment.py", line 804, in _load_template
template = self.loader.load(self, name, globals)
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/jinja2/loaders.py", line 113, in load
source, filename, uptodate = self.get_source(environment, name)
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/templating.py", line 60, in get_source
return self._get_source_fast(environment, template)
File "/home/test/.local/share/virtualenvs/test-app-C_4gkQLO/lib/python3.7/site-packages/flask/templating.py", line 89, in _get_source_fast
raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: aboutapp/info.html

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

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

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

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

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

rie_

2020/01/15 07:17

コメントはじめていただきました。 ありがとうございます 起動コマンドの違いは意識していませんでした。 おっしゃる通りモノが違います。 ただtemplatesを保存している個所はいずれも指定していません。 追加した1つのHTMLだけが見えない原因として、OS環境によりデフォルトが違うということでしょうか。 WindowsではVSCodeのデバック構成より実行しています。 "configurations": [ { "name": "Python: Flask", "type": "python", "request": "launch", "module": "flask", "env": { "FLASK_APP": "app", "FLASK_ENV": "development", "FLASK_DEBUG": "1" }, "args": [ "run", //"--no-debugger", "--no-reload" ], "jinja": true, "console": "integratedTerminal" }, UNIXではrun.pyで パッケージからアプリのコピーを取得して実行しています。 # run.py # 開発サーバー起動ファイル from app import create_app import os app = create_app(os.getenv('FLASK_ENV')) if __name__ == "__main__": app.run(debug=True)
nico25

2020/01/15 07:35 編集

問題と関係あるかわからないのですが UNIX サーバ側を `python` コマンドからではなく ``` python run.py ``` `flask run` コマンドで起動させても、同じ症状は発生しますか? ``` export FLASK_APP=app export FLASK_ENV=development export FLASK_DEBUG=1 flask run --no-reload ```
rie_

2020/01/15 07:57

UNIX サーバ側ですが、実際には以下の起動をしています。 さきほどの run.pyを以下の内容のシェル(run.sh)で呼び出します。 ``` FLASK_ENV=production FLASK_APP=run.py flask run --debugger --reload --host=0.0.0.0 ``` さらに、以下の起動スクリプト(start.sh)を ``` export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" cd /home/test/test-app pipenv run sh run.sh ``` サービス(test.service)に登録して、 ``` [Unit] Description=test service [Service] User=test Group=test WorkingDirectory=/home/test-app ExecStart=/home/test-app/start_test.sh [Install] WantedBy=multi-user.target ``` サービスを起動するということをしています。 ``` $ sudo systemctl start test ``` run.sh、start.shをコマンドに入力して起動してみると エラーになりほかの画面も動かなくなります。 エラー(ajax対応で入れたCORSがエラーになる) ``` ImportError: No module named 'flask_cors' ```
FiroProchainezo

2020/01/15 09:06

Unixに持って行ったら動かなくなるっていうのが気になるのですが、フォルダ名やファイル名のどこかに大文字が入っていませんか? Windowsの場合、実際のファイルが`Info.html`でrender_template('info.html')と呼び出していても動いた気がしますが、Unixに持って行ったら動かなくなる気がします。 あとはエラーメッセージの以下を確認するくらいでしょうか・・・。 File "/home/test/test-app/app/views/auth.py", line 142, in wrapped_view return view(kwargs) File "/home/test/test-app/app/views/aboutapp.py", line 19, in info auth.pyの142行目付近、aboutapp.pyの19行目付近が怪しいのかな?
nico25

2020/01/15 09:08

すいません、お手上げです... orz いまは「ワーキングディレクトリ」が、正しいのか気になっています。 > 追加した1つのHTMLだけが見えない原因として、 > OS 環境によりデフォルトが違うということでしょうか。 templates ディレクトリの絶対パスは __main__ を元にして算出されています。 ``` app = Flask(__name__) bp = blueprint(__name__) ``` * https://cero-stress.com/solve-flask-mystery/ この __main__ は、パッケージのルートからの「相対パス」を表示してくれます。 ``` # app/__init__.py なら assert __name__ == 'app' ``` ``` # app/views/__init__.py なら assert __name__ == 'app.views' ``` ``` # app/views/__init__.py なら assert __name__ == 'app.views.auth' ``` 「相対パス」なので「絶対パス」に変換する必要があります。 変換に当たって基準となるパスは「ワーキングディレクトリ」の **はず** です。 以下のコマンドで起動されているとのことなのですが... ``` $ sudo systemctl start test ``` 「ワーキングディレクトリ」が、正しいのか気になっています。 ``` [Service] User=test Group=test # ここも若干気になっています。 WorkingDirectory=/home/test-app ExecStart=/home/test-app/start_test.sh # test が必要? # WorkingDirectory=/home/test/test-app # ExecStart=/home/test/test-app/start_test.sh ``` ただ、普段自分が Systemd は使っていないので、 提示していただい設定を読み取れずにいます。
rie_

2020/01/15 23:50

ありがとうございます。 初期化について教えていただいたサイトでまた理解しておきます。 # test が必要? # WorkingDirectory=/home/test/test-app →これは、UNIXのApachにほかのアプリが上がっているのでユーザで分けて、一つ階層をかませています。 url_prefix_str = '/test' # views/about.py from .views import about app.register_blueprint(about.bp, url_prefix=url_prefix_str + '/about')
rie_

2020/01/15 23:51

大文字は使っておらず、何か文字列に設定ミスがあるのかと、 aboutapp/info → about/info にすべて置き換えてみました。 するとうまくUNIXでも動きました。 結果として、何かどこかでミスがあったのかもしれません。。 皆さんのヒントのおかげで解消することができました。 ありがとうございました。
nico25

2020/01/16 01:39

そう言っていただけると助かります。 迷宮入りしなくてよかったです :)
guest

回答1

0

自己解決

すべて小文字ではありましたが、何か文字列に設定ミスがあるのかと、

aboutapp/info → about/info にすべて置き換えてみました。

するとうまくUNIXでも動きました。
結果として、修正している中でも自分では見つけられませんでしたが、
何かどこかでミスがあったのかもしれません。。

皆さんのヒントのおかげで解消することができました。
ありがとうございました。

投稿2020/01/15 23:53

rie_

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問