84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
闭关修行中......
路由規則表 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 内部的,也就是说:
rule/path
当用户请求 /a 时,会调用 /a 条路由规则指定的视图函数来处理这个请求。
/a
同理,/users/<string:username> 也是一样。
/users/<string:username>
在 flask 的 url_map 路由表中,rule/path 和 endpoint 在路由规则表里都是唯一的
rule
path
endpoint
尤其是 endpoint,如果重复会报错。
rule/path,虽然可以重复,但其实只有第一条会生效。
如果开发者没有在 @app.route 装饰器或 app.add_url_rule() 函数调用处指定 endpoint 的话,flask 会为这条 Rule 规则 指定一个默认的 endpoint,即这个 view function 的名字。
@app.route
app.add_url_rule()
view function
一个 view function,可以有多个 endpoint、rule。是个一对多的关系。
反过来,一个 endpoint,只能有一个 rule, 也只能有一个 view function。
现在,回头来看题主的疑问。
1 . 『路由的内部名字是什么?』
名字是:index。
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
/users/
#!/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)
看這樣一段程式碼
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
不知道這個回答能否幫助你理解endpoint http://segmentfault.com/q/1010000002980493
概念
路由規則表 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。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。 🎜 🎜2 . 『endpoint 是一個附加到視圖函數的名稱,所以,endpoint名稱就是視圖函數的名稱麼? ’🎜 🎜不是。如同上面 🎜重點🎜 處所說,如果沒有🎜明確🎜指定 endpoint,flask 會將視圖函數的名稱也即此處的index
作為此路由規則的 endpoint。 🎜 🎜3 . 『為什麼需要endpoint參數的時候,需要把視圖函數的名稱傳進去? ’🎜 🎜並非是 🎜視圖函數的名稱🎜,其實是endpoint
的名字,只不過正巧在某些時候,endpoint 的名字和🎜視圖函數的名稱🎜是一樣的。 🎜 🎜Demo🎜 rrreee看這樣一段程式碼
我們可以用類別的方式寫路由,flask中把這種寫法抽象成修飾器,函數名稱=endpoint
不知道這個回答能否幫助你理解endpoint http://segmentfault.com/q/1010000002980493