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 的意义到底是什么?
1
xcv58 2016-09-09 05:48:03 +08:00
确实不清楚,没看懂什么意思。
|
2
zeayes 2016-09-09 08:27:47 +08:00
dispatch request 需要用 endpoint ,只是在 app.route 中,默认是以当前函数名作为 endpoint 。
|
3
guyskk 2016-09-09 09:12:38 +08:00 via Android
flask.url_for 需要通过 endpoint 得到 url ,可以避免匿名函数的问题。
|
4
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 其实是一个东西,相互别名 |
5
WordCount 2016-09-09 11:13:15 +08:00
|
6
aec4d 2016-09-09 11:51:30 +08:00 1
一句话就是函数是可变对象 字符串是不可变对象
你可以看一下 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 对象了 |
7
herozem OP |
8
aec4d 2016-09-09 17:03:16 +08:00
@herozem 至少我是这么理解的 如果直接使用函数当做 endpoint 那么所有构建 URL 的函数都无法使用 还有对于大型应用毫无疑问函数名是很容易重复出现的 这样连匹配都会出问题 然而 flask 的 Blueprint 就是使用 Blueprint 的名字加上函数名作为 endpoint 解决了这个问题
|
9
zhangmiaoCHN 2016-09-12 19:07:27 +08:00
@aec4d 解释的很全面。
@herozem 这里也有相关讨论: http://stackoverflow.com/a/19262349 我试想过把 endpoint 这一层拿走,其实对写应用包括 Route 本身的实现并没有什么影响。 |
10
herozem OP @zhangmiaoCHN 嗯,看过了 stackoverflow 上的这篇回答。但是我仍然觉得有疑问就是,直接写 `/admin/greeting` 和 `/user/greeting` 有什么区别吗?另外函数重名其实也是可以避免的,例如不要 `from admin import greeting` 而用 `admin.greeting` 代替就可以了。 说到底,我就是在寻找 endpoint 的存在必要性。不过目前看来,也许只是为了写大项目的时候方便点,并没有绝对的存在必要性。
|
11
zhangmiaoCHN 2016-09-12 19:23:00 +08:00
@herozem 的确是,如果追究到底, endpoint 感觉上的确没有绝对意义上的存在必要。
|
12
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> |