黄舟2017-04-17 16:22:02
路由規則表 url_map._rules
Rule 規則之一
函數 / view function - 處理某個 endpoint/path 的視圖函數。可簡單理解為,處理某個/組 URL 的函數。
終點 / endpoint - flask 內部的標誌
其他 / Rule 規則轉換器、methods 之類的
建立 Rule/path
為 Rule/path 分配 endpoint
為 Rule/path 指定 view function.
一個 request 進來的時候,是依據 rule/path
來定位到 app 內部的,也就是說:rule/path
来定位到 app 内部的,也就是说:
当用户请求 /a
时,会调用 /a
条路由规则指定的视图函数来处理这个请求。
同理,/users/<string:username>
也是一样。
在 flask 的 url_map 路由表中,rule
/path
和 endpoint
在路由规则表里都是唯一的
尤其是 endpoint
,如果重复会报错。
rule/path
,虽然可以重复,但其实只有第一条会生效。
如果开发者没有在 @app.route
装饰器或 app.add_url_rule()
函数调用处指定 endpoint 的话,flask 会为这条 Rule 规则 指定一个默认的 endpoint,即这个 view function
的名字。
一个 view function
,可以有多个 endpoint
、rule
。是个一对多的关系。
反过来,一个 endpoint
,只能有一个 rule
, 也只能有一个 view function
。
现在,回头来看题主的疑问。
1 . 『路由的内部名字是什么?』
名字是:index
。
在题主所说的下面的这个视图中,endpoint/路由规则表内部名称是 index
,因为并未在 @app.route
函数调用中显式指定 endpoint。
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'))
2 . 『endpoint 是一个附加到视图函数的名称,所以,endpoint名就是视图函数的名称么?』
不是。正如上面 重点 处所说,如果没有显式指定 endpoint,flask 会将视图函数的名称也即此处的 index
当作此路由规则的 endpoint。
3 . 『为什么需要endpoint参数的时候,需要把视图函数的名称传进去?』
并非是 视图函数的名称,其实是 endpoint
/a
時,會呼叫 /a
條路由規則指定的視圖函數來處理這個請求。
🎜🎜同理,/users/
也是一樣。 🎜🎜
🎜
🎜
🎜
🎜在 flask 的 url_map 路由表中,rule
/path
和 endpoint
在路由規則表裡都是唯一的🎜
🎜
🎜🎜尤其是 endpoint
,如果重複會報錯。 🎜🎜
🎜🎜rule/path
,雖然可以重複,但其實只有第一條會生效。 🎜🎜
🎜
🎜
🎜🎜如果開發者沒有在@app.route
裝飾器或app.add_url_rule()
函數呼叫處指定endpoint 的話,flask 會為這條🎜Rule 規則🎜 指定一個預設的endpoint,即這個view function
的名字。 🎜🎜
🎜
🎜關係🎜
🎜
🎜🎜一個 view function
,可以有多個 endpoint
、rule
。是個一對多的關係。 🎜🎜
🎜🎜反過來,一個 endpoint
,只能有一個 rule
, 也只能有一個 view function
。 🎜🎜
🎜
🎜答案與解釋🎜
🎜現在,回頭來看題主的疑問。 🎜
🎜1 . 『路由的內部名字是什麼? ’🎜
🎜名字是:index
。 🎜
🎜在題主所說的下面的這個視圖中,endpoint/路由規則表內部名稱是index
,因為並未在@app.route
函數呼叫中🎜顯式🎜指定endpoint。 🎜
#!/usr/bin/env python3
# coding=utf-8
import flask
app = flask.Flask(__name__)
@app.route('/', endpoint="home")
def amihome():
'''
请尝试以 `/` 和 `/shajiquan` 两个路径来访问;
'''
return "View function: {view}. Endpoint: {endpoint}".format(view="amihome", endpoint=flask.request.endpoint)
# 给 app 添加一条 url rule, 指定 rule, endpoint, 但不指定 view function.
app.add_url_rule(rule='/shajiquan', endpoint="shajiquan", methods=["GET", "DELETE"])
# 为 endpoint="shajiquan" 指定 view function
app.view_functions['shajiquan'] = amihome
@app.route('/')
def miao():
return "wu at: {}".format(flask.request.endpoint)
# 尝试取消注释
# app.view_functions['home'] = miao
if __name__ == '__main__':
app.run(debug=True, port=8964)
🎜2 . 『endpoint 是一個附加到視圖函數的名稱,所以,endpoint名稱就是視圖函數的名稱麼? ’🎜
🎜不是。如同上面 🎜重點🎜 處所說,如果沒有🎜明確🎜指定 endpoint,flask 會將視圖函數的名稱也即此處的 index
作為此路由規則的 endpoint。 🎜
🎜3 . 『為什麼需要endpoint參數的時候,需要把視圖函數的名稱傳進去? ’🎜
🎜並非是 🎜視圖函數的名稱🎜,其實是 endpoint
的名字,只不過正巧在某些時候,endpoint 的名字和🎜視圖函數的名稱🎜是一樣的。 🎜
🎜Demo🎜
rrreee大家讲道理2017-04-17 16:22:02
看這樣一段程式碼
class LoginView(views.MethodView):
def get(self):
pass
def post(self):
pass
app.add_url_rule(
'/login/',
endpoint='login',
view_func=LoginView.as_view(b'login'),
methods=['POST', 'GET']
)
我們可以用類別的方式寫路由,flask中把這種寫法抽象成修飾器,函數名稱=endpoint