解決したいこと
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かと思うのですが、何か原因が分かる方がいらっしゃいましたら、ご教授頂けますと幸いです。
その他に必要な情報がありましたら提示いたします。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー