一直以來對url_for函數的用法很模糊,看了一篇文章終於有些瞭解了。https://blog.csdn.net/yannanxiu/article/details/52287870
url_for()函數是用於構建指定函數的URL。
url_for操作對象是函數,而不是route裏的路徑。
寫一個測試代碼:
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index():
return "hello"
@app.route('/login')
def login():
return "world"
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
運行後結果是這樣的:
/
/login
然後我將login()這個函數名字改爲LOGIN(),再次運行,然後就報錯了。因爲這時候不再有login()這個函數存在了,url_for不能構造關於login的新鏈接了。
BuildError: Could not build url for endpoint ‘login’. Did you mean ‘index’ instead?
在python+flask的web開發中,url_for() 函數最簡單的用法是以視圖函數名作爲參數, 返回對應的 URL。還可以用redirect函數進行跳轉。它是重定向函數,輸入一個URL後,自動跳轉到另一個URL所在的地址,下面是一段代碼實例。
from flask import Flask,url_for,render_template,redirect
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('user_index',username='default'))
@app.route('/user/<username>/<userid>')
def user_index(username,userid):
return render_template('index.html',username=username)
執行上面這代碼的時候,我們訪問程序給出的http://127.0.0.1/5000頁面,這時由於redirect函數的作用,頁面會跳轉到由url_for函數生成的鏈接的頁面。顯示index.html裏面的內容。我們可以看到,usr_for函數的第一個參數是函數名user_index,就是說,它會返回user_index對應的URL,也就是http://127.0.0.1/5000/user/defualt 。
對於url_for的一點新發現
先貼代碼:
class Course(Base):
...
@property
def url(self):
return url_for('course.detail',course_id=self.id)
上面這個類是一個數據庫的映射對象,對應數據庫的一張表。爲了後面方便,我給它增加了一個url屬性。可以看到,url_for函數的第一個參數是‘course.detail’。detail這個函數在另一個python模塊中,並且course這個文件夾和當前這段代碼所在的文件夾並不在同一目錄。所以這一點我覺得有點奇怪。
還有一個點,使用url_for() 生成動態地址時, 將動態部分作爲關鍵字參數傳入。例如,
url_for ('user', name='john', _external=True)
的返回結果是http://localhost:5000/user/john。 傳入url_for() 的關鍵字參數不僅限於動態路由中的參數。函數能將任何額外參數添加到 查詢字符串中。例如,url_for(‘index’, page=2) 的返回結果是/?page=2。