python - Flask里endpoint view function 路由等概念如何理解
阿神
阿神 2017-04-17 16:20:02
0
3
578
阿神
阿神

闭关修行中......

全部回覆(3)
黄舟

概念

  • 路由規則表 url_map._rules

    • Rule 規則之一

      • 函數 / view function - 處理某個 endpoint/path 的視圖函數。可簡單理解為,處理某個/組 URL 的函數。

      • 終點 / endpoint - flask 內部的標誌

      • 其他 / Rule 規則轉換器、methods 之類的

流程:

  1. 建立 Rule/path

  2. 為 Rule/path 分配 endpoint

  3. 為 Rule/path 指定 view function.

重點

  1. 一個 request 進來的時候,是依據 rule/path 來定位到 app 內部的,也就是說:rule/path 来定位到 app 内部的,也就是说:

    • 当用户请求 /a 时,会调用 /a 条路由规则指定的视图函数来处理这个请求。

    • 同理,/users/<string:username> 也是一样。

  2. 在 flask 的 url_map 路由表中,rule/pathendpoint 在路由规则表里都是唯一的

    • 尤其是 endpoint,如果重复会报错。

    • rule/path,虽然可以重复,但其实只有第一条会生效。

  3. 如果开发者没有在 @app.route 装饰器或 app.add_url_rule() 函数调用处指定 endpoint 的话,flask 会为这条 Rule 规则 指定一个默认的 endpoint,即这个 view function 的名字。

关系

  • 一个 view function,可以有多个 endpointrule。是个一对多的关系。

  • 反过来,一个 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/pathendpoint 在路由規則表裡都是唯一的🎜 🎜 🎜🎜尤其是 endpoint,如果重複會報錯。 🎜🎜 🎜🎜rule/path,雖然可以重複,但其實只有第一條會生效。 🎜🎜 🎜 🎜 🎜🎜如果開發者沒有在@app.route 裝飾器或app.add_url_rule() 函數呼叫處指定endpoint 的話,flask 會為這條🎜Rule 規則🎜 指定一個預設的endpoint,即這個view function 的名字。 🎜🎜 🎜 🎜關係🎜 🎜 🎜🎜一個 view function,可以有多個 endpointrule。是個一對多的關係。 🎜🎜 🎜🎜反過來,一個 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
大家讲道理

看這樣一段程式碼

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!