說明: URL規則可添加變量部分,也就是說將符合同種規則的URL抽象成一個URL模式
1
2
3
|
@app
.route(
'/instance/<uuid>/'
)
def
instance(uuid):
return
'Instance: {}'
.
format
(uuid)
|
注意: 尖括號中內容是動態的,凡是匹配到/instance/前綴的都會被映射到這個路由上,在內部把uuid作為參數而獲得,默認類型為字符串
默認轉換:
說明: 可通過<converter:variable_name>形式來指定轉換方式,converter可以是如下默認轉換器,也可以是繼承自werkzeug.routing.BaseConverter子類定義的轉換器
轉換(默認的轉換器存儲在app.url_map.converts字典里,支持自定義) | 簡單 |
string | 接收沒有任何斜杠/的文本 |
int | 接收整型 |
float | 接收浮點型 |
path | 接收任意文本包含/的文本 |
uuid | 接收唯一識別碼 |
any() | 和PY中的內置any用法一致,可指定多腫可選路徑,但必須傳入參數 |
擴展: 如上轉換都是基於子路徑,如果不想使用子路徑,其實還可以通過GET/POST傳遞參數的方式給/instance,然后在視圖函數內部通過request.args.get()和request.form.get()來獲取實現
定義轉換:
說明: FLASK還支持自定義轉換器如Rebbit中使用分割符來實現如http://reddit.com/r/python+flask隔開兩個社區名字,方便同時查看來自多個社區的帖子,我們可以自定義甚至不一定使用"+"來實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# 51CTOBG: http://xmdevops.blog.51cto.com/
# Purpose:
#
"""
# 說明: 導入公共模塊
from
flask
import
Flask, jsonify
from
werkzeug.routing
import
BaseConverter
# 說明: 導入其它模塊
class
ListConverter(BaseConverter):
def
__init__(
self
, url_map, separator
=
u
'+'
):
super
(ListConverter,
self
).__init__(url_map)
self
.separator
=
separator
def
to_python(
self
, value):
return
value.split(
self
.separator)
def
to_url(
self
, values):
values_quoted
=
[]
for
value
in
values:
values_quoted.append(BaseConverter.to_url(value))
return
self
.separator.join(values_quoted)
app
=
Flask(__name__)
app.url_map.converters.update({
'list'
: ListConverter
})
@app
.route(
'/r/<list(separator=u"+"):page_names>/'
)
def
r(page_names):
return
jsonify(page_names)
if
__name__
=
=
'__main__'
:
app.run(host
=
'0.0.0.0'
, port
=
9000
, debug
=
True
)
|
注意: 繼承werkzeug.routing.BaseConverter的類必須實現兩個方法to_python(value),它定義了匹配的路徑以何種方式傳入視圖函數,to_url(value),它定義了傳入視圖函數的參數的路徑原型的編碼后形式,它是供內部調用,但也是必須實現的方法,最后需要將ListConverter放到app.url_map.converters中去才會運行時生效,按照如上轉換器訪問http://127.0.0.1:9000/python+flask/時傳入視圖函數的參數page_names其實是一個被分割的列表[u'python', u'flask'],這樣我們就可以模擬Reddit實現同時獲取多個社區帖子
提交方法:
說明: HTTP有多個訪問URL的方法,默認只響應GET,但可以通過app.route裝飾器傳遞methods參數改變此行為,默認FLASK會自動處理HEAD/OPTIONS請求,常用GET/POST請求但隨着AJAX和RESET風格應用的流行,PUT/DELETE/PATCH請求也使用很廣泛~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# 51CTOBG: http://xmdevops.blog.51cto.com/
# Purpose:
#
"""
# 說明: 導入公共模塊
from
flask
import
Flask, request, jsonify
# 說明: 導入其它模塊
app
=
Flask(__name__)
@app
.route(
'/'
, methods
=
[
'GET'
,
'POST'
])
def
index():
return
jsonify([
request.args,
request.form
])
if
__name__
=
=
'__main__'
:
app.run(host
=
'0.0.0.0'
, port
=
9000
, debug
=
True
)
|
說明: GET/POST是我們最常用的方式,至於獲取GET/POST請求的參數分別用request.args和request.form來獲取通過jsonify生成的響應我們可以看出來其實它們就是兩個參數字典
唯一特性:
說明: FLASK的規則都是基於WerkZeug的路由模塊,它規定URL唯一,當裝飾器@app.route('/instance/')這樣時訪問/instance時會自動被修改為/instance/,而當裝飾器@app.route('/instance')這樣時訪問/instance/會返回404,必須訪問/instance才可以獲取到你想要的內容~以此來保證唯一性~