Flask中endpoint的理解(小结)

 更新时间:2019年12月11日 11:05:55   作者:Eric_Nirvana  
这篇文章主要介绍了Flask中endpoint的理解(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在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 – the URL rule as string
endpoint – the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint
view_func – the function to call when serving a request to the provided endpoint
options – 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都有一个view_functions,这是一个字典,存储endpoint-view_func键值对。add_url_rule的第一个作用就是向view_functions中添加键值对(这件事在应用程序run之前就做好了)
  • 每个应用程序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')
def test():
  pass


@app.route('/', 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')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python实现canny边缘检测

    python实现canny边缘检测

    本文主要讲解了canny边缘检测原理:计算梯度幅值和方向、根据角度对幅值进行非极大值抑制、用双阈值算法检测和连接边缘以及python 实现
    2020-09-09
  • python imutils包基本概念及使用

    python imutils包基本概念及使用

    python imutils包可以很简洁的调用opencv接口,轻松实现图像的平移,旋转,缩放,骨架化等操作,对python imutils包基本概念及使用方法感兴趣的朋友一起看看吧
    2021-07-07
  • Python实现内网穿透和端口转发代理详解

    Python实现内网穿透和端口转发代理详解

    这篇文章主要为大家介绍了Python实现内网穿透和端口转发代理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • python四则运算表达式求值示例详解

    python四则运算表达式求值示例详解

    这篇文章主要为大家介绍了python四则运算表达式求值示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Python Locals变量管理新尝试引领代码风潮

    Python Locals变量管理新尝试引领代码风潮

    在Python中,locals()函数是一个强大的工具,它使程序员能够访问和操作当前作用域内的局部变量,本文将深入探讨locals()函数的功能、应用和重要性
    2024-01-01
  • Pandas 缺失数据处理的实现

    Pandas 缺失数据处理的实现

    这篇文章主要介绍了Pandas 缺失数据处理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • python写的ARP攻击代码实例

    python写的ARP攻击代码实例

    这篇文章主要介绍了python写的ARP攻击代码实例,需要的朋友可以参考下
    2014-06-06
  • Python MySQLdb模块连接操作mysql数据库实例

    Python MySQLdb模块连接操作mysql数据库实例

    这篇文章主要介绍了Python MySQLdb模块连接操作mysql数据库实例,本文直接给出操作mysql代码实例,包含创建表、插入数据、插入多条数据、查询数据等内容,需要的朋友可以参考下
    2015-04-04
  • Python使用Flask编写一个网站的代码指南

    Python使用Flask编写一个网站的代码指南

    使用Flask编写一个网站是一个相对简单且有趣的过程,Flask是一个用Python编写的轻量级Web应用框架,它易于上手,同时也非常强大,适合构建从简单的博客到复杂的Web应用的各种项目,以下是一个使用Flask编写简单网站的指南,包括代码示例,需要的朋友可以参考下
    2024-11-11
  • Python中import机制详解

    Python中import机制详解

    在刚刚接触python时,我们会被其优美的格式、简洁的语法和无穷无尽的类库所震撼。在真正的将python应用到实际的项目中,你会遇到一些无法避免的问题。最让人困惑不解的问题有二类,一个编码问题,另一个则是引用问题。本文主要讨论关于Python中import的机制与实现
    2017-11-11

最新评论