python-flask之路由及請求參數

簡單示例如下

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來體會轉換器的作用

  1. http://127.0.0.1:5000/book/python/author
  2. http://127.0.0.1:5000/book/13/price
  3. http://127.0.0.1:5000/book/price-ge/22.3
  4. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章