Flask中的endpoint是什么
小编给大家分享一下Flask中的endpoint是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
在Flask中我们常常会在请求处理中使用endpoint,那么如何理解Flask中的endpoint呢?
首先,我们看一个例子:
@app.route('/user/<name>')defuser(name):return'Hello,%s'%name
这个是我们在用flask框架写网站中最常用的。
通过看源码,我们可以发现:
函数等效于:
defuser(name)return'Hello,%s'%nameapp.add_url_rule('/user/<name>','user',user)
这个add_url_rule函数在文档中是这样解释的:
add_url_rule(*args,**kwargs)ConnectsaURLrule.Worksexactlyliketheroute()decorator.Ifaview_funcisprovideditwillberegisteredwiththeendpoint.
add_url_rule有如下参数:
抛开options这个参数不谈,我们看看前三个参数。
rule:这个参数很简单,就是匹配的路由地址
view_func:这个参数就是我们写的视图函数
endpoint:这个参数就是我今天重点要讲的,endpoint
很多人认为:假设用户访问http://www.example.com/user/eric,flask会找到该函数,并传递name='eric',执行这个函数并返回值。
但是实际中,Flask真的是直接根据路由查询视图函数么?
在源码中我们可以发现:
1、每个应用程序app都有一个view_functions,这是一个字典,存储endpoint-view_func键值对。add_url_rule的第一个作用就是向view_functions中添加键值对(这件事在应用程序run之前就做好了)
2、每个应用程序app都有一个url_map,它是一个Map类(具体实现在werkzeug/routing.py中),里面包含了一个列表,列表元素是Role的实例(werkzeug/routing.py中)。add_url_rule的第二个作用就是向url_map中添加Role的实例(它也是在应用程序run之前就做好了)
我们可以通过一个例子来看:
app=Flask(__name__)@app.route('/test',endpoint='Test')deftest():pass@app.route('/',endpoint='index')defhello_world():return'HelloWorld!'if__name__=='__main__':print(app.view_functions)print(app.url_map)app.run()
运行这个程序,结果是:
{'static':<boundmethodFlask.send_static_fileof<Flask'flask-code'>>,'Test':<functiontestat0x10065e488>,'index':<functionhello_worldat0x10323d488>}Map([<Rule'/test'(HEAD,OPTIONS,GET)->Test>,<Rule'/'(HEAD,OPTIONS,GET)->index>,<Rule'/static/<filename>'(HEAD,OPTIONS,GET)->static>])*Runningonhttp://127.0.0.1:5000/(PressCTRL+Ctoquit)
所以我们可以看出:这个url_map存储的是url与endpoint的映射!
回到flask接受用户请求地址并查询函数的问题。实际上,当请求传来一个url的时候,会先通过rule找到endpoint(url_map),然后再根据endpoint再找到对应的view_func(view_functions)。通常,endpoint的名字都和视图函数名一样。
这时候,这个endpoint也就好理解了:
实际上这个endpoint就是一个Identifier,每个视图函数都有一个endpoint,当有请求来到的时候,用它来知道到底使用哪一个视图函数。
在实际应用中,当我们需要在一个视图中跳转到另一个视图中的时候,我们经常会使用url_for(endpoint)去查询视图,而不是把地址硬编码到函数中。
这个时候,我们就不能使用视图函数名当endpoint去查询了
我们举个例子来说明。比如:
app=Flask(__name__)app.register_blueprint(user,url_prefix='user')app.register_blueprint(file,url_prefix='file')
我们注册了2个蓝图。
在user中(省略初始化过程):
@user.route('/article')defarticle():pass
在file中(省略初始化过程):
@file.route('/article')defarticle():pass
这时候,我们发现,/article这个路由对应了两个函数名一样的函数,分别在两个蓝图中。当我们使用url_for(article)调用的时候(注意,url_for是通过endpoint查询url地址,然后找视图函数),flask无法知道到底使用哪个蓝图下的endpoint,所以我们需要这样:
url_for('user.article')
以上是Flask中的endpoint是什么的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。