# Flask實作_基礎_03_簡述url_for與route
###### tags: `python` `flask`
在討論[Python Flask實作_基礎_01_建立第一個app](https://hackmd.io/s/SyP4YEnef)與[Python Flask實作_基礎_02_透過url傳值](https://hackmd.io/s/H1CMTVheG)之後,我們已經有了flask中關於路由的簡單概念,這次我們要討論flask中`url_for`的功能,以及它跟route的關聯。
## 作業說明
我們現在明白,透過裝飾器`@app.route()`可以定義路由,使用者可以利用該路由來訪問網頁。
```python=
@app.route('/')
def index():
return 'hello man'
@app.route('/user/<username>')
def username(username):
return 'i am ' + username
@app.route('/age/<int:age>')
def userage(age):
return 'i am ' + str(age) + 'years old'
```
現在有一個問題在於如果今天程式都寫死路由,一但路由有所變更,那就必需對所有的專案開始搜尋,然後一起修正路由,對吧!
所以在flask有個方式可以避免這個問題,就是透過`url_for`,這是flask內建的函數,可以從flask直接導入
```python=
from flask import url_for
```
我們加入兩個路由測試,如下:
```python
@app.route('/a')
def url_for_a():
return 'here is a'
@app.route('/b')
def b():
# 所得結果為'/a'
return url_for('url_for_a')
```
我們定義了`@app.route('/a')`所裝飾的function名稱為`url_for_a`,然後在`@app.route('/b')`的部份,將`@app.route('/a')`所裝飾的function`url_for_a`當做url_for的參數,接著執行這個專案,測試如下:
這是`@app.route('/a')`

這是`@app.route('/b')`

我們會發現到`@app.route('/b')`所回傳的值是另一個路由`/a`,透過`url_for`可以讓flask反過來從被裝飾的function去找出相對應的路由。
所以在return的部份只要透過`redirect`搭配`url_for`,就可以將使用者引導到另一個路由去。那就可以避免掉調整路由之後整個專案都要去調整的問題了!
```python=
from flask import redirect
@app.route('/a')
def url_for_a():
return 'here is a'
@app.route('/b')
def b():
# 會將使用者引導到'/a'這個路由
return redirect(url_for('url_for_a'))
```
## 總結
`redirect`是一個重新導向的函數,從名稱不難理解它的功能,因此沒有多做說明,`url_for`非常實用,專案之中必然用到,它的概念不止如此,還有`endpoint`的觀念需要理解,但不急,實作之中我們會有更詳細的說明,不管如何,我們已經知道在專案內要避免直接寫死路由,而是利用`redirect`搭配`url_for`來避免因路由調整而必需整個專案大改的冏境。
**上一話:**[Flask實作_基礎_02_透過url傳值](https://hackmd.io/s/H1CMTVheG)
**下一話:**[Flask實作_基礎_04_什麼是app.debug?](https://hackmd.io/s/H10_LR2gz)