LoginSignup
48
30

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-17

はじめに

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の中身は関数名!!

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

48
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
30