簡單示例如下
from flask import Flask app = Flask(__name__) @app.route('/hello') def hello(): return 'hello' @app.route('/books') def books(): return 'books' if __name__ == '__main__': app.run(debug=True)
變量規則
上面的示例中,不論是/hello 還是 /books,URL都是固定的,
但URL可不都是固定的,比如/book/1/price 這種restful風格的URL,中間的1是某個book的id,如果用GET方法來請求這個URL,則表示希望獲取id爲1的book的價格。
這種URL的某一部分是變化的,這一次請求是/book/1/price,下一次請求或許會變成/book/21/price,你無法爲每一個URL綁定一個處理函數。
爲了解決這種情況,flask允許你在URL設置動態變化的部分,給URL添加變量部分,像/book/1/price 這種URL,就可以這樣綁定
@app.route('/book/<int:id>/price') def price(id): return str(id)
這種URL變量部分的規則爲 <converter:variable_name> ,variable_name將作爲參數傳遞給所綁定的函數,而且可以根據converter轉換器對variable_name進行轉換
converter轉換器有下面幾種
轉換器 | 說明 |
---|---|
int | 接受整數 |
float | 接受浮點數 |
path | 接受帶斜線的path |
如果不標註轉換器類型,則默認轉爲字符串,下面是這幾種轉換器的例子
# 不指定轉換器 @app.route('/book/<name>/author') def author(name): return name # 轉換器爲int @app.route('/book/<int:id>/price') def price(id): return str(id) # 轉換器爲float @app.route('/book/price-ge/<float:price>') def books_by_price(price): return str(price) # 轉換器爲path @app.route('/book/<path:book_info>') def books_by_path(book_info): return book_info
啓動服務,一次在瀏覽器裏訪問下面的URL來體會轉換器的作用
- http://127.0.0.1:5000/book/python/author
- http://127.0.0.1:5000/book/13/price
- http://127.0.0.1:5000/book/price-ge/22.3
- http://127.0.0.1:5000/book/2019/09/sales
路由規則管理
添加路由規則,除了使用route裝飾器外,還可以使用add_url_rule方法直接添加,下面兩段代碼在功能作用上是一樣的
1、使用route添加路由規則
@app.route('/add_url') def add_rule(): return 'add url rule'
2、使用add_url_rule添加路由規則
def add_rule(): return 'add url rule' app.add_url_rule('/add_url', 'add_rule', add_rule)
在route裝飾器中,調用了add_url_rule方法來添加路由規則,因此,他們最終的效果是一樣的
設置method
http協議中,有很多種請求方法
一個URL,我們可以使用不同的方法來請求,在創建路由規則時,我們可以指定這個URL支持哪些請求方法
@app.route('/users', methods=['GET', 'POST']) def users(): return 'ok'
在route裝飾器中設置methods,如果不設置該參數,則默認支持GET方法。
users函數既要處理GET請求,又要處理POST請求,那麼如何區分它們呢? 這就要用到請求對象request
from flask import Flask, request app = Flask(__name__) @app.route('/users', methods=['GET', 'POST']) def users(): if request.method == 'GET': return 'get' if request.method == 'POST': return 'post' return 'ok' if __name__ == '__main__': app.run(debug=True)
flask請求對象request
request是flask框架的全局對象,你可以通過它來獲得當前進入的請求數據,如果是在多線程環境下,flask可以保證你所使用的request對象就是當前這個線程所處理的請求。
既然request是請求對象,那麼合理的猜測是通過它,我們可以獲得當前請求的全部信息,例如請求的method,path, url, headers,cookies,請求的參數,請求的body.....
事實上也的確如此,下面的服務端代碼和客戶端代碼,將互相配合向你演示如何使用request獲得有關當前請求的重要信息
服務端代碼
from flask import Flask, request app = Flask(__name__) @app.route('/users', methods=['GET', 'POST']) def users(): print(request.method) # 請求方法 print(request.headers) # 請求的headers print(request.path) # 資源路徑 print(request.url) # 完整的url print(request.remote_addr) # 客戶端IP print(request.cookies) # 請求的cookie return 'ok' if __name__ == '__main__': app.run(debug=True)
客戶端代碼
import requests cookie_dict = {'name': 'python'} res = requests.get('http://127.0.0.1:5000/users', cookies=cookie_dict)
使用客戶端代碼發出請求後,服務端程序會輸出如下內容
GET # 請求方法 Content-Type: Content-Length: Host: 127.0.0.1:5000 User-Agent: python-requests/2.22.0 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive Cookie: name=python /users # 資源路徑 http://127.0.0.1:5000/users # 完整路徑 127.0.0.1 # 客戶端ip {'name': 'python'} # 請求的cookie
提醒一點,request.remote_addr並不一定能夠準確的獲得客戶端的IP,因爲在部署服務時,通常最前端用nginx做轉發,這樣,你獲得其實是nginx的IP地址,而非用戶的真實地址
解析get請求參數
介紹flask如何解析http的get請求的參數, 解析post請求提交的表單和json數據,
get請求用於查詢數據,通常會帶有參數,參數放在path的後面,中間用問號連接,多個請求參數以key=value的形式用&連接起來,
下面是一個帶參數的get請求的示例url
http://127.0.0.1:5000/users?name=poly&age=14
get請求的參數可以通過request.args來獲得,也可以通過request.values來獲得
下面是使用方法示例
@app.route('/users', methods=['GET', 'POST']) def users(): name = request.args['name'] age = request.args['age'] print(name, age) return 'ok'
需要注意的是,獲取到的參數一律都是字符串類型,使用時需要你自己做類型轉換
獲得post請求表單數據
post請求用於新增數據,
它提交數據的格式有兩種,一種是form表單,一種是json數據,
requests.form裏存儲着post請求提交的form表單數據,
下面是解析示例
@app.route('/users', methods=['POST']) def users(): name = request.form['name'] age = request.form['age'] print(name, age) return 'ok'
使用request.values
不論是request.args, 還是request.form,其類型都是MultiDict,
因此,flask又提供了一個request.values,類型爲CombinedMultiDict,它包含了args和form,
這樣,在獲取數據時,就不必在糾結到底用args還是用form了,request.values使用方法與args,form相同
獲得json數據
客戶端的post請求,put請求,有可能提交的是json數據,而非form表單數據,
post提交的json數據,不能通過args,form.values來獲取,而是要用get_json()方法來獲取
服務端示例代碼
@app.route('/users', methods=['POST']) def users(): data = request.get_json() print(data) return 'ok'
客戶端示例代碼
import requests res = requests.post('http://127.0.0.1:5000/users', json={'name': 'poly', 'age': 13})
參考:http://www.coolpython.net/flask_tutorial/basic/flask-parse-request-data.html