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

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

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

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

Python

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

Q&A

解決済

1回答

5405閲覧

【Flask】Blueprintにて分割するとwerkzeug.routing.BuildErrorが出ます。

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

Python

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

0グッド

0クリップ

投稿2021/12/20 14:25

編集2021/12/21 00:11

解決したいこと

Flaskの使用は初めてで学習用に管理画面の作成をしております。
Internal Server Errorのwerkzeug.routing.BuildErrorにより、web表示ができない状況です。
Blueprintを使用し、起動ファイルとroutingを分割して正常にWebに表示させたいです。
Blueprintを使用する前は、正常に表示されておりました。

階層構造
skip/
├ app.py
├ views/
|└ skip_view.py
└ templates/
|└ application.html
|└ index.html
|└ nav.html

#環境
・CentOS7
・Python3.6
・Flask2.0.2

発生している問題・エラー

[2021-12-18 16:05:55,757] ERROR in app: Exception on / [GET] Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2073, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1518, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1516, in full_dispatch_request rv = self.dispatch_request() File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1502, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "./views/skip_view.py", line 11, in home return render_template('index.html', title=title) File "/usr/local/lib/python3.6/site-packages/flask/templating.py", line 150, in render_template ctx.app, File "/usr/local/lib/python3.6/site-packages/flask/templating.py", line 128, in _render rv = template.render(context) File "/usr/local/lib/python3.6/site-packages/jinja2/environment.py", line 1291, in render self.environment.handle_exception() File "/usr/local/lib/python3.6/site-packages/jinja2/environment.py", line 925, in handle_exception raise rewrite_traceback_stack(source=source) File "/var/www/skip/templates/index.html", line 1, in top-level template code {% extends 'application.html' %} File "/var/www/skip/templates/application.html", line 15, in top-level template code {% block body %} File "/var/www/skip/templates/index.html", line 5, in block 'body' {% include 'nav.html' %} File "/var/www/skip/templates/nav.html", line 7, in top-level template code <a href="{{ url_for('home') }}">Home</a> File "/usr/local/lib/python3.6/site-packages/flask/helpers.py", line 338, in url_for return appctx.app.handle_url_build_error(error, endpoint, values) File "/usr/local/lib/python3.6/site-packages/flask/helpers.py", line 326, in url_for endpoint, values, method=method, force_external=external File "/usr/local/lib/python3.6/site-packages/werkzeug/routing.py", line 2314, in build raise BuildError(endpoint, values, method, self) werkzeug.routing.BuildError: Could not build url for endpoint 'home'. Did you mean 'views.home' instead?

該当するソースコード

▼app.py

from views import skip_view from flask import Flask app = Flask(__name__) # 分割したBlueprintを登録する app.register_blueprint(skip_view.app) if __name__ == "__main__": app.run(debug=True)

▼views/skip_view.py

# import app_logger from flask import Blueprint, render_template, url_for # Blueprintのオブジェクトを生成する app = Blueprint('views', __name__) @app.route('/') def home(): title = "管理画面" # app_logger.logger.info("TOPページ") return render_template('index.html', title=title)

*一部抜粋しております。

▼templates/application.html

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{{title}}</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/reset.css') }}"> <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"> <link rel="preconnect" href="https://fonts.gstatic.com"> <!-- <script src="{{ url_for('static', filename='js/index.js') }}"></script> --> <script src="https://kit.fontawesome.com/23659bd18a.js" crossorigin="anonymous"></script> </head> <body> {% block body %} {% endblock %} </body> </html>

▼templates/index.html

{% extends 'application.html' %} {% block body %} <section class="admin"> {% include 'nav.html' %} <div class="right_content"> {% include 'header.html' %} <div id="content"> <div class="home_content"> <div class="user_content"> <h3>ユーザ管理</h3> <a href="{{ url_for('user_edit_form') }}"><p>ユーザ情報の編集</p></a> <a href="{{ url_for('user_list') }}"><p>ユーザ一覧</p></a> </div> <div class="news_content"> <h3>お知らせ管理</h3> <a href="{{ url_for('news_post_form') }}"><p>お知らせ投稿</p></a> <a href="{{ url_for('news_list') }}"><p>お知らせ一覧</p></a> </div> </div> </div> {% include 'footer.html' %} </div> </section> {% endblock %}

▼templates/nav.html

<nav id="admin_nav"> <h1> <img src="{{ url_for('static', filename='images/logo.png') }}"> </h1> <ul class="admin_nav"> <li class="admin_nav_home"> <a href="{{ url_for('home') }}">Home</a> </li> </ul> </nav>

*一部抜粋しております。

自分で試したこと

該当エラーを基に自身で調査してみたのですが、同じようなエラーが見当たらなく解決出来ていない状況です。
@app.route('/')のhome関数とurl_forにて指定している値が間違っているのかと思い、確認してみましたが、特に問題は無いかと思いました。
エラー文に「Did you mean 'views.home' instead?」とありましたので、url_for側をviews.homeと指定してみましたが、こちらも解決には繋がりませんでした。

エラー文から原因箇所は恐らくBlueprintを使用しているskip_view.pyかrender_templateで呼び出しているnav.htmlかと思うのですが、何か原因が分かる方がいらっしゃいましたら、ご教授頂けますと幸いです。
その他に必要な情報がありましたら提示いたします。
よろしくお願いいたします。

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

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

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

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

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

quickquip

2021/12/20 23:06

index.html と application.html の中身と場所を書いてください。
退会済みユーザー

退会済みユーザー

2021/12/21 00:12

ご確認頂きありがとうございます。 先ほど、index.htmlとapplication.htmlの中身と階層構造と追記いたしました。 お手数お掛けしますが、よろしくお願いいたします。。
guest

回答1

0

ベストアンサー

Did you mean 'views.home' instead?

と書いてあるとおりかと思いますが。

もしくは、

html

1 <a href="{{ url_for('.home') }}">Home</a>

でしょう。

https://flask.palletsprojects.com/en/2.0.x/blueprints/#building-urls


イメージ説明

application.html

html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>{{title}}</title> 6 </head> 7 8 <body> 9 {% block body %} 10 {% endblock %} 11 </body> 12</html>

index.html

html

1{% extends 'application.html' %} 2 3{% block body %} 4 {% include 'nav.html' %} 5{% endblock %}

nav.html

html

1<nav id="admin_nav"> 2 <h1> 3 </h1> 4 <ul class="admin_nav"> 5 <li class="admin_nav_home"> 6 <a href="{{ url_for('views.home') }}">Home</a> 7 </li> 8 </ul> 9</nav>

app.py

python

1from flask import Flask 2 3from views import skip_view 4 5app = Flask(__name__) 6app.register_blueprint(skip_view.app) 7 8if __name__ == "__main__": 9 app.run(debug=True)

skip_view.py

python

1from flask import Blueprint, render_template 2 3# Blueprintのオブジェクトを生成する 4app = Blueprint('views', __name__) 5 6 7@app.route('/') 8def home(): 9 title = "管理画面" 10 return render_template('index.html', title=title)

で実行を確認できました。

nav.html

html

1 <a href="{{ url_for('.home') }}">Home</a>

でも動きます。

nav.html

html

1 <a href="{{ url_for('home') }}">Home</a>

werkzeug.routing.BuildError: Could not build url for endpoint 'home'. Did you mean 'views.home' instead?が再現できます。

投稿2021/12/20 14:43

編集2021/12/21 01:06
quickquip

総合スコア11029

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

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

退会済みユーザー

退会済みユーザー

2021/12/20 15:02

ご回答頂きありがとうございます。 > Did you mean 'views.home' instead? こちらは、{{ url_for('views.home') }}と指定する認識したのですが、エラー解消とはなりませんでした。 また、頂いた{{ url_for('.home') }}でもエラー解消とはならないようです。。 エラー文も変わっておりませんでした。
退会済みユーザー

退会済みユーザー

2021/12/21 01:31

再度ご確認、ご回答頂きありがとうございます。 頂いた内容にて私の方でも実行を確認出来ました。 数日エラー解消が出来なかったため、大変助かりました。。! お手数お掛けしました。本当にありがとうございます。 ただ、再起動やキャッシュの削除は行なっていたのですが、何が原因だったのでしょうか。 app.pyのモジュールの読み込み順などでしょうか。。
quickquip

2021/12/21 01:36

テンプレートhtmlはキャッシュなどはしないはずです。真っ先に疑うのは保存し忘れですが……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問