翻译整理自Stack Overflow:http://stackoverflow.com/questions/19261833/what-is-an-endpoint-in-flask
原文中用到了my_greeting视图函数/端点,我估计是答者笔误,故修改为了give_greeting

Flask路由是如何工作的

整个flask框架(及以Werkzeug类库为基础构建的应用)的程序理念是把URL地址映射到你想要运行的业务逻辑上(最典型的就是视图函数),例如:

@app.route('/greeting/<name>')
def give_greeting(name):return 'Hello, {0}!'.format(name)

注意,add_url_rule函数实现了同样的目的,只不过没有使用装饰器,因此,下面的程序是等价的:

# 抬头没有使用路由装饰器,我们在最后用另一种方法添加路由.
def give_greeting(name):return 'Hello, {0}!'.format(name)app.add_url_rule('/greeting/<name>', 'give_greeting', give_greeting)

备注:add_url_rule()中3个参数依次是ruleview_funcendpoint.

假设www.example.org站点定义了以上视图,用户在浏览器中输入以下地址

http://www.example.org/greeting/Mark

Flask的工作就是捕捉这个URL地址,弄清用户想要做什么,并在众多的Python函数中匹配一个可以处理它的函数,回到我们的实例中,URL地址就是

/greeting/Mark

拿着这个地址到路由表中做匹配,flask发现这个地址指向了give_greeting函数。
然而,当我们用这种最常用的方法创建视图时,flask却向我们隐藏了一些其他的细节信息。在这个场景中,flask并没有直接从URL地址跳转到应该响应它请求的视图函数上:

URL (http://www.example.org/greeting/Mark) 被视图函数处理 ("give_greeting"函数)

事实上,这里还有另一个步骤–把URL地址映射到端点上(URL**–>endpoint–>**viewfunction):

URL (http://www.example.org/greeting/Mark) 映射到端点"give_greeting"上.
指向端点"give_greeting"的请求被视图函数"give_greeting"处理.

从根本上来说,端点就是程序中一组逻辑处理单元的ID,该ID对应的代码决定了对此ID请求应该作出何种响应。通常,端点与视图函数同名,但是你也可以修改它,例如:

@app.route('/greeting/<name>', endpoint='say_hello')
def give_greeting(name):return 'Hello, {0}!'.format(name)

现在就成了这样:

URL (http://www.example.org/greeting/Mark) 映射到端点"say_hello"上.
指向端点"say_hello"的请求被视图函数"give_greeting"处理.

Endpoint有什么作用

端点通常用作反向查询URL地址(viewfunction**–>endpoint–>**URL)。例如,在flask中有个视图,你想把它关联到另一个视图上(或从站点的一处连接到另一处)。不用去千辛万苦的写它对应的URL地址,直接使用URL_for()就可以啦:

@app.route('/')
def index():print url_for('give_greeting', name='Mark') # 打印出 '/greeting/Mark'@app.route('/greeting/<name>')
def give_greeting(name):return 'Hello, {0}!'.format(name)

备注:url_for()give_greeting是端点名.

这样做是大有裨益的:我们可以随意改变应用中的URL地址,却不用修改与之关联的资源的代码。

为何要多此一举

那么问题来了:为何要多此一举,为何要先把URL映射到端点上,再通过端点映射到视图函数上,为何不跳过中间的这个步骤?
原因就是采用这种方法能够使程序更高、更快、更强。例如蓝本。蓝本允许我们把应用分割为一个个小的部分,现在admin蓝本中含有超级管理员级的资源,user蓝本中则含有用户一级的资源。
蓝本允许咱们把应用分割为一个个以命名空间区分的小部分:
main.py:

from flask import Flask, Blueprint
from admin import admin
from user import userapp = Flask(__name__)
app.register_blueprint(admin, url_prefix='admin')
app.register_blueprint(user, url_prefix='user')

admin.py:

admin = Blueprint('admin', __name__)@admin.route('/greeting')
def greeting():return 'Hello, administrative user!'

user.py:

user = Blueprint('user', __name__)
@user.route('/greeting')
def greeting():return 'Hello, lowly normal user!'

注意,在两个蓝本中路由地址‘/greeting’的函数都叫"greeting"。如果我想调用admin对应的greeting函数,我不能说“我想要greeting”,因为这里还有一个user对应的greeting函数。端点这时就发挥作用了:指定一个蓝本名称作为端点的一部分–通过这种方式端点实现了对命名空间的支持。所以,我们可以这样写:

print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'

来发实例

from flask import Flask, url_forapp = Flask(__name__)# We can use url_for('foo_view') for reverse-lookups in templates or view functions
@app.route('/foo')
def foo_view():pass# We now specify the custom endpoint named 'bufar'. url_for('bar_view') will fail!
@app.route('/bar', endpoint='bufar')
def bar_view():passwith app.test_request_context('/'):print (url_for('foo_view'))  #/fooprint (url_for('bufar'))  #/bar# url_for('bar_view') will raise werkzeug.routing.BuildErrorprint (url_for('bar_view'))  #端点bar_view是没有定义的

程序运行结果

更多参考:
http://www.cnblogs.com/eric-nirnava/p/endpoint.html

Flask中'endpoint'(端点)的理解相关推荐

  1. flask中关于endpoint端点、url_map映射、view_func视图函数,view_functions、及视图函数名是否何以相同的问题?

    视图函数中关于url_map视图的映射:应该是[  url->methonds->endpoint  ] 而整个请求的过程,是先通过url地址映射到端点endpoint,然后通过endpo ...

  2. Flask中路由系统以及蓝图的使用

    一.Flask的路由系统 1.@app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route("/info", methods=[ ...

  3. flask开发桌面应用程序_使用Microsoft Authenticatio将多个破折号应用程序嵌入Flask中...

    flask开发桌面应用程序 Full disclosure: I am not an expert in developing web applications. I don't even consi ...

  4. USB开设备开发学习之三:USB中的端点详细了解

    原文:https://blog.csdn.net/go_str/article/details/80985717 前言     端点在实际的USB通讯过程种的具体作用与含义十分重要,但是有些难以理解, ...

  5. USB中的端点详细了解

    /*********************************************************************** USB入门系列: 1.USB行业标准介绍 2.USB具 ...

  6. Flask中的其他控件

    Day04 1.分页器方法 分页器BaseQuery.paginate()pageper_pageFalsePaginationitemspages获取总页数prev_num上一页的页码has_pre ...

  7. Flask中路由使用解析

    Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...

  8. Flask中的CBV

    Flask中的CBV 在Flask中和Django一样有两种视图模式,一种是基于函数,一种是基于类.下面来讨论一下Flask的CBV模式. 首先,说明一下flask视图函数注册路由的本质: 其实,ro ...

  9. USB中的端点详细了解(转)

    原文链接: http://www.360doc.com/content/19/0806/08/7551_853249151.shtml 前言 端点在实际的USB通讯过程种的具体作用与含义十分重要,但是 ...

最新文章

  1. Linux RSS/RPS/RFS/XPS对比
  2. [转]url传递中文的解决方案总结
  3. spring boot项目配置RestTemplate超时时长
  4. 这家AI公司用面具破解中国人脸识别系统!微信、支付宝、火车站无一幸免
  5. 第十五节:Asp.Net Core MVC和WebApi路由规则的总结和对比-第二十节
  6. C/C++入门的精髓!太全了吧,收藏夹的必备
  7. a start job is running for延迟90s的解决办法
  8. 直播电商只能卖便宜货吗?
  9. jenkins java jar_Jenkins 安装和配置、启动jar包
  10. RocketMQ学习-概览
  11. python3 与python2 异常处理的区别与联系
  12. wpe封包修改服务器数据,wpe 封包 数据包 修改实例
  13. 打开本地计算机策略,win7本地组策略打开方法介绍
  14. 迅睿CMS插件自动采集伪原创免费插件
  15. 从gitlab迁移到极狐gitlab的方法 #JIHULAB101
  16. 计算机二级第二课堂学记录表,第二课堂学分/第二课堂学分是什么?大学第二课堂学分不够...
  17. 简单版的相似图片搜索原理
  18. TextView(显示文本)
  19. 用canvas画布绘制扇形和弧线
  20. 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA

热门文章

  1. Ins照片墙下载工具:4K Stogram for Mac
  2. java 刷新jtextarea,SwingPropertyChangeSupport动态更新JTextArea
  3. 解决Photoshop CS6在window10中窗口字体太小问题
  4. 毕业设计 基于单片机的智能音响设计与实现 -物联网 嵌入式 stm32
  5. Linux vim 文本替换 %s/原文/替换文本/g
  6. 目标检测——day66 Scaled-YOLOv4: Scaling Cross Stage Partial Network
  7. Microsoft SQL Server 2000 Service Pack 3a
  8. windows 完成端口
  9. 算法竞赛入门经典——训练指南
  10. git导入项目时,git出现10054错误