|
概述
在Flask開發中總是會遇到一些陷阱,下面是自己踩到的關於url_for()的陷阱,是在使用flask的單元測試時遇到的。
url_for()函數是用來建構指定函數的URL。
url_for操作物件是函數,而不是route裡的路徑。
如果route和函數名稱不一樣而導致使用url_for()錯誤,千萬不要去route找錯誤。
例如下面的程式碼:
- from flask import Flask, url_for
- app = Flask(\__name__)
- @app.route('/')
- def index():
- pass
- @app.route('/login')
- def LOGIN():
- pass
- with app.test_request_context():
- print(url_for('index'))
- print(url_for('login'))
複製代碼
print(url_for('index'))沒有報錯,就是一個反斜線;print(url_for('login'))報錯,拋出BuildError異常:
Traceback (most recent call last):
File “<\pyshell#12>”, line 3, in
print(url_for('login'))
File “C:\Python35\lib\site- packages \flask\helpers.py”, line 332, in appforfor
. endpoint, values)
File “C:\Python35\lib\site-packages\flask\app.py”, line 1811, in handle_url_build_error
reraise(exc_type, exc_value, tb)
File “C:\Ppackz5”slibc_type, Fpyline, 3:\Pocy活動, n一周
raise value
File “C:\Python35\lib\site-packages\flask\helpers.py”, line 322, in url_for
force_external=external)
File “C:\Python35\lib\site-packages\werkzeugugd 30, 326"
, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint 'login'. Did you mean 'index' instead?
把login修改為LOGIN:
- with app.test_request_context():
- print(url_for('index'))
- print(url_for('LOGIN'))
複製代碼
列印正常:
參數
url_for()也可以附帶一些參數,例如想要完整的URL,可以設定_external為Ture:
- url_for('.static',_external=True,filename='pic/test.png')
複製代碼
這樣回傳的url是http://localhost/static/pic/test.png
endpoint
URL的端點(即函數的名字)
values
URL的變數參數
_external
如果設定為True,則產生一個絕對路徑URL
_scheme
一個字串指定所需的URL方案。 _external參數必須設定為True,不然會拋出ValueError。
_anchor
如果設定了這個則給URL加一個mao
_method
如果設定這個則顯示地呼叫這個HTTP方法
參考資料:http://dormousehole.readthedocs.io/en/latest/api.html#flask.url_for
|
|