首頁  >  問答  >  主體

python - Flask里endpoint view function 路由等概念如何理解

阿神阿神2765 天前610

全部回覆(3)我來回復

  • 黄舟

    黄舟2017-04-17 16:22:02

    概念

    • 路由規則表 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

    回覆
    0
  • 大家讲道理

    大家讲道理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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 16:22:02

    不知道這個回答能否幫助你理解endpoint http://segmentfault.com/q/1010000002980493

    回覆
    0
  • 取消回覆