Flask中endpoint的理解(小结)
技术  /  管理员 发布于 7年前   122
在flask框架中,我们经常会遇到endpoint这个东西,最开始也没法理解这个到底是做什么的。最近正好在研究Flask的源码,也就顺带了解了一下这个endpoint
首先,我们看一个例子:
@app.route('/user/<name>')def user(name): return 'Hello, %s' % name
这个是我们在用flask框架写网站中最常用的。
通过看源码,我们可以发现:
函数等效于
def user(name) return 'Hello, %s' % name app.add_url_rule('/user/<name>', 'user', user)
这个add_url_rule函数在文档中是这样解释的:
add_url_rule(*args, **kwargs)
Connects a URL rule. Works exactly like the route() decorator. If a view_func is provided it will be registered with the endpoint.
add_url_rule有如下参数:
rule C the URL rule as string
endpoint C the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint
view_func C the function to call when serving a request to the provided endpoint
options C the options to be forwarded to the underlying Rule object. A change to Werkzeug is handling of method options. methods is a list of methods this rule should be limited to (GET, POST etc.). By default a rule just listens for GET (and implicitly HEAD). Starting with Flask 0.6, OPTIONS is implicitly added and handled by the standard request handling.
抛开options这个参数不谈,我们看看前三个参数。
rule:这个参数很简单,就是匹配的路由地址
view_func:这个参数就是我们写的视图函数
endpoint:这个参数就是我今天重点要讲的,endpoint
很多人认为:假设用户访问http://www.example.com/user/eric,flask会找到该函数,并传递name='eric',执行这个函数并返回值。
但是实际中,Flask真的是直接根据路由查询视图函数么?
在源码中我们可以发现:
我们可以通过一个例子来看:
app = Flask(__name__)@app.route('/test', endpoint='Test')def test(): [email protected]('/', endpoint='index')def hello_world(): return 'Hello World!'if __name__ == '__main__': print(app.view_functions) print(app.url_map) app.run()
运行这个程序,结果是:
{'static': <bound method Flask.send_static_file of <Flask 'flask-code'>>, 'Test': <function test at 0x10065e488>, 'index': <function hello_world at 0x10323d488>}
Map([<Rule '/test' (HEAD, OPTIONS, GET) -> Test>,
<Rule '/' (HEAD, OPTIONS, GET) -> index>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
所以我们可以看出:这个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')def article(): pass
在file中(省略初始化过程):
@file.route('/article')def article(): pass
这时候,我们发现,/article这个路由对应了两个函数名一样的函数,分别在两个蓝图中。当我们使用url_for(article)调用的时候(注意,url_for是通过endpoint查询url地址,然后找视图函数),flask无法知道到底使用哪个蓝图下的endpoint,所以我们需要这样:
url_for('user.article')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号