Help us understand the problem. What is going on with this article?

Flaskのページリンクで@app.route()とurl_for()の中身がややこしくなる問題について

はじめに

pythonでwebアプリケーションを作成しているときに(flaskで),なんかいまいちflaskのルートについて理解できなかったので備忘録兼実験を含めて書いていきましたよ.いかに結論的なコードを示しておきます.

#test.py
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/mayo')
def senbei():
    return 'I like senbei.'

if __name__=='__main__':
    app.run(debug=True)
<!--index.html-->
<html>
    <head>
    <head>
    <body>
        <a href="{{url_for('senebi')}}"><h1>Hello</h1></a>
    </body>
</html>

結論から申し上げるでござる

1. @app.route()の引数にはURL

2. url_for()の中身は呼び出したい関数名

を入れるべし.くわしい仕様はドキュメントを見てね.

1. @app.route()の引数にはURL

例えばURLに

http://127.0.0.1:5000/

と打つと,エンドポイントは/なので
スクリーンショット (8).png

となります.また

http://127.0.0.1:5000/mayo

と打つとエンドポイントは/mayoなので
スクリーンショット (11).png

となります.これはsenbei関数の中で実装している言葉ですね!つまりURLにいれるその値を入れたら呼び出される関数をその

@app.route()

の中で定義しているんですね.
ではここでURLのエンドポイントに関数名indexsenbeiを入れてみるとそれぞれ
スクリーンショット (12).png
スクリーンショット (13).png

となり,何も呼び出されないことがわかります(main.pyからは)
つまり,@app.route()の引数はブラウザのURL!!

2. url_for()の中身は呼び出したい関数名

ただし,url_for()という関数は名前がurlとかついてるくせに引数は呼び出したい関数名なんですな.だから以下のようにするとリンク先に正常に行く

<a href="{{url_for('senbei')}}"><h1>Hello</h1></a>

表示されるページはこんな感じで
スクリーンショット (8).png

Helloを押すと以下のところに飛ぶ
スクリーンショット (11).png

先ほどの逆で,url_forの中身を以下のように@app.route()の引数(すなわちブラウザに打ち込むURL)にしてみると

<a href="{{url_for('/')}}"><h1>Hello senbei!</h1></a>
<!-- or -->
<a href="{{url_for('/mayo')}}"><h1>Hello senbei!</h1></a>

とするとだいたい以下のようなエラーが吐かれる
スクリーンショット (15).png

つまりurl_forの中身は関数名!!

こんなちんけな内容でも誰かの役に立つといいです...

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away