url_for函數——快速尋找url

咱們已經知道,知道了url就能夠找到對應的視圖函數,那麼如今問題來了,若是咱們知道了視圖函數,要怎麼找到url呢?這時候咱們就須要url_for函數了。python

# coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目錄@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/')def login(): print url_for('hello_world') return 'success'if __name__ == '__main__': app.run() 

運行上面代碼:面試

能夠看到控制檯打印出了hello_world函數的url。flask

當咱們講了模板之後,常常會遇到a標籤好比<a href=''>咱們都知道href裏面放的是一個連接,試想如今咱們判斷用戶是否登陸成功,若是登陸成功就跳轉到p1頁面,登陸失敗就跳轉到p2頁面,那麼咱們通常是不會再href裏直接貼p1頁面的url的,由於一旦p1頁面地址改變,那麼貼的url就會失效,試想你那麼多代碼,怎麼可能記得住p1的url都在哪裏用了呢?這時候就能夠看到url_for的好處了,就是說咱們會在href裏放url_for咱們須要反轉的函數。ruby

再看一個例子:app

# coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目錄@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/')def login(): return url_for('hello_world')@app.route('/list/')def mylist(): return url_for('login')if __name__ == '__main__': app.run() 

這時候進入http://127.0.0.1:5000/list/頁面,就能夠看到login的url了:函數

 

上面說的是沒有參數的url_for,若是沒有參數,能夠直接url_for('函數名')那若是咱們構造的函數是:測試

@app.route('/login/<page_id>/')def login(page_id): return u'登陸頁面' 

這時候url_for該怎麼傳呢?編碼

咱們先來看一下url_for的源碼:url

咱們注意到url_for能夠傳「兩個」參數:spa

  • endpoint:結束點,即咱們傳的函數名

  • values:關鍵字參數即key=value形式

那咱們如今就知道該怎麼辦了:

# coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目錄@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/<page_id>/')def login(page_id): return u'登陸頁面'@app.route('/list/')def mylist(): return url_for('login', page_id=1)if __name__ == '__main__': app.run() 

咱們只須要像上面代碼裏同樣,給url_for多傳遞一個參數便可,保存(Ctrl+s 之後再也不強調了)之後,來到頁面能夠看到:

繼續url_for的知識點

# coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目錄@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/<page_id>/')def login(page_id): return u'登陸頁面'@app.route('/list/')def mylist(): return url_for('login', page_id=1, title_id=2)if __name__ == '__main__': app.run() 

如今咱們在mylist函數中的url_for多傳一個參數,這時候會返回什麼結果呢,執行代碼能夠看到:

看上面的代碼,若是如今我想在login函數中獲取title_id,該怎麼獲取呢?咱們以前已經寫過的,咱們能夠經過修改login函數:

@app.route('/login/<page_id>/')def login(page_id): title_id = flask.request.args.get('title_id') return title_id 

這樣,在頁面訪問127.0.0.1:5000/login/2/頁面顯示的就是title_id。

如今咱們來講url_for的另外一個優勢,就是它會自動對你傳遞的內容進行編碼:

# coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目錄@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/<page_id>/')def login(page_id): return u'登陸頁面'@app.route('/list/')def mylist(): return url_for('login', page_id=1, title_id='/')if __name__ == '__main__': app.run() 

若是對軟件測試、接口測試、自動化測試、面試經驗交流。感興趣能夠加軟件測試交流:1085991341,還會有同行一塊兒技術交流。
上面代碼中,咱們在mylist函數中給login函數傳了一個title_id='/',而後頁面中看到:

頁面對/進行了ASCII編碼,/變成了%2F。這種機制就避免了url的混亂,好比咱們地址是127.0.0.1:5000/login/,後面查詢字符串中含有/,那地址就成了相似127.0.0.1:5000/login//這種url形式明顯是錯誤的,可是若是咱們用url_for,那麼地址 就會自動轉換爲127.0.0.1:5000/login/%2F,如此一來就避免了url的錯亂。

你們千萬不要忽視函數上面的@app.route(),找了好幾個代碼顯示樣式,就是怕你們忽視這個問題。以上內容但願對你有幫助,有被幫助到的朋友歡迎點贊,評論。

相關文章
相關標籤/搜索