url_for函數——快速尋找url


我們已經知道,知道了url就可以找到對應的視圖函數,那么現在問題來了,如果我們知道了視圖函數,要怎么找到url呢?這時候我們就需要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/')def login(): print url_for('hello_world') return 'success'if __name__ == '__main__': app.run() 

運行上面代碼:

可以看到控制台打印出了hello_world函數的url。

當我們講了模板以后,經常會遇到a標簽比如<a href=''>我們都知道href里面放的是一個鏈接,試想現在我們判斷用戶是否登錄成功,如果登錄成功就跳轉到p1頁面,登錄失敗就跳轉到p2頁面,那么我們一般是不會再href里直接貼p1頁面的url的,因為一旦p1頁面地址改變,那么貼的url就會失效,試想你那么多代碼,怎么可能記得住p1的url都在哪里用了呢?這時候就可以看到url_for的好處了,就是說我們會在href里放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/')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_for可以傳“兩個”參數:

  • 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(),找了好幾個代碼顯示樣式,就是怕大家忽視這個問題。
以上內容希望對你有幫助,有被幫助到的朋友歡迎點贊,評論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM