flask 中的 endpoint 的存在的意义是什么?

2016-09-08 23:17:35 +08:00
 herozem

RT 。

e.g.

def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
        Basically this example::

            @app.route('/')
            def index():
                pass

        Is equivalent to the following::

            def index():
                pass
            app.add_url_rule('/', 'index', index)

endpoint 作为 url -> endpoint -> func 中间的一层,并没有找到什么特别大的意义?如果说是为了在 url 上进行弄上一层 "namespace" , 例如 /admin/hello/user/hello 都绑住各自目录下 一个叫做 hello 的函数。那为什么不直接 通过 url -> func 的方式将 /admin/hello 和 admin 下的 hello 函数绑起来, /user/hello 和 user 下的 hello 函数绑起来?

也许上面的描述不太清楚。但是总的意思就是, endpoint 的意义到底是什么?

5057 次点击
所在节点    Flask
12 条回复
xcv58
2016-09-09 05:48:03 +08:00
确实不清楚,没看懂什么意思。
zeayes
2016-09-09 08:27:47 +08:00
dispatch request 需要用 endpoint ,只是在 app.route 中,默认是以当前函数名作为 endpoint 。
guyskk
2016-09-09 09:12:38 +08:00
flask.url_for 需要通过 endpoint 得到 url ,可以避免匿名函数的问题。
zhangmiaoCHN
2016-09-09 09:19:12 +08:00
Flask 中的 endpoint 和 Django 中的 name 是一个概念。如果 add_url_rule 不指定 endpoint ,默认是会用函数名比如 index 作为 endpoint 。

url -> endpoint -> func 其实可以理解为两层的 url --> endpoint(func)
其中, endpoint 和 func 其实是一个东西,相互别名
WordCount
2016-09-09 11:13:15 +08:00
aec4d
2016-09-09 11:51:30 +08:00
一句话就是函数是可变对象 字符串是不可变对象
你可以看一下 werkzeug 的 routing.py 部分代码 是一个非常比较独立的模块 其中有这样一段
`endpoint`
The endpoint for this rule. This can be anything. A reference to a
function, a string, a number etc. The preferred way is using a string
because the endpoint is used for URL generation.

在 werkzeug 中 endpoint 是 rule 的一个属性
self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule)
主要使用 2 个方法 match 和 build 前者从 url 匹配到 endpoint 后者从 endpoint 还原 url
如果你使用函数当做 endpoint 第一部分不会有问题 第二部分就不一定了 对函数加一个装饰器它就变了 此时你就无法正确匹配到 rule 对象了
herozem
2016-09-09 16:15:23 +08:00
@xcv58 尴尬

@zeayes
@zhangmiaoCHN 所以为什么不直接用 url -> func 的形式?


@guyskk 能避免匿名函数的问题?能举个例子吗?


@WordCount stackoverflow 上的我看到过了,但是还是没有充分的理由啊,就是为了 url_for 一个函数就加一层么。。


@aec4d 所以说到底,就是为了 url_for 这个函数,所以要在 url 和函数之间加一层么
aec4d
2016-09-09 17:03:16 +08:00
@herozem 至少我是这么理解的 如果直接使用函数当做 endpoint 那么所有构建 URL 的函数都无法使用 还有对于大型应用毫无疑问函数名是很容易重复出现的 这样连匹配都会出问题 然而 flask 的 Blueprint 就是使用 Blueprint 的名字加上函数名作为 endpoint 解决了这个问题
zhangmiaoCHN
2016-09-12 19:07:27 +08:00
@aec4d 解释的很全面。

@herozem 这里也有相关讨论: http://stackoverflow.com/a/19262349

我试想过把 endpoint 这一层拿走,其实对写应用包括 Route 本身的实现并没有什么影响。
herozem
2016-09-12 19:13:48 +08:00
@zhangmiaoCHN 嗯,看过了 stackoverflow 上的这篇回答。但是我仍然觉得有疑问就是,直接写 `/admin/greeting` 和 `/user/greeting` 有什么区别吗?另外函数重名其实也是可以避免的,例如不要 `from admin import greeting` 而用 `admin.greeting` 代替就可以了。 说到底,我就是在寻找 endpoint 的存在必要性。不过目前看来,也许只是为了写大项目的时候方便点,并没有绝对的存在必要性。
zhangmiaoCHN
2016-09-12 19:23:00 +08:00
@herozem 的确是,如果追究到底, endpoint 感觉上的确没有绝对意义上的存在必要。
noobsheldon
2016-12-21 13:48:44 +08:00
endpoint 的值是唯一的,同一模块中可以有同名的 view function (视图函数)。对于 url_for 函数的参数,如果使用函数名作为参数,则无法确定其 url ;使用 endpoint 作为参数,则保证了 url_for 返回确定的 url 。

<code>

# encoding: utf-8
from flask import Flask

app=Flask(__name__)

@app.route('/',endpoint="good")
def index():
return "Good jod"

@app.route('/<int:id>',endpoint="bad")
def index(id):
return "%s"%id

if __name__ == "__main__":
app.run()
</code>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/304941

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX