python flask url參數
常見 url 傳參中都是 xxx?xxx=xxx
問題來了 flask中我沒有找到 關於xx? 問號的使用方式
是不是flask就不支持這種方式
如果有 route配置的時候該如何寫?
?后面的部分不參與url匹配,route時不必考慮。
url_for
是可以干這個事情的
路由定義:
@app.route('/') @app.route('/page/<int:page>/') def index(page=1): pass
演示:
In [6]: url_for('index', page=3, a=2, b=3) Out[6]: '/page/3/?a=2&b=3'
?后面是參數
可以通過request.args.get訪問
from flask import Flask, request app = Flask(__name__) @app.route('/') def hello(): text = request.args.get('text') return 'hello %s' text
通過 /?text=world
訪問 即可打出 hello world
構造URL(url_for):
一般我們通過一個URL
就可以執行到某一個函數。如果反過來,我們知道一個函數,怎么去獲得這個URL
呢?url_for
函數就可以幫我們實現這個功能。url_for()
函數接收兩個及以上的參數,他接收函數名作為第一個參數,接收對應URL規則的命名參數,如果還出現其他的參數,則會添加到URL
的后面作為查詢參數。
通過構建URL
的方式而選擇直接在代碼中拼URL
的原因有兩點:
- 將來如果修改了
URL
,但沒有修改該URL
對應的函數名,就不用到處去替換URL
了。 url_for()
函數會轉義一些特殊字符和unicode
字符串,這些事情url_for
會自動的幫我們搞定。
from flask import Flask,url_for app = Flask(__name__) @app.route('/') def hello_world(): #將my_list函數名以字符串方式傳到url_for里面 print(url_for('my_list')) return 'Hello World!' @app.route('/list/') def my_list(): return 'my_list' if __name__ == '__main__': app.run()
運行,訪問瀏覽器查看結果
在控制台打印出了如下結果:
在url_for添加參數,會自動添加到url后面
以后不管你原來的url如何修改,我都能通過url_for返回你修改過的正確url
# url_for筆記:
### `url_for`的基本使用:
`url_for`第一個參數,應該是視圖函數的名字的字符串。后面的參數就是傳遞給`url`。
如果傳遞的參數之前在`url`中已經定義了,那么這個參數就會被當成`path`的形式給
`url`。如果這個參數之前沒有在`url`中定義,那么將變成查詢字符串的形式放到`url`中。
```python
@app.route('/post/list/<page>/')
def my_list(page):
return 'my list'
print(url_for('my_list',page=1,count=2))
# 構建出來的url:/my_list/1/?count=2
```
### 為什么需要`url_for`:
1. 將來如果修改了`URL`,但沒有修改該URL對應的函數名,就不用到處去替換URL了。
2. `url_for`會自動的處理那些特殊的字符,不需要手動去處理。
```python
url = url_for('login',next='/')
# 會自動的將/編碼,不需要手動去處理。
# url=/login/?next=%2F
```
### 強烈建議以后在使用url的時候,使用`url_for`來反轉url。