翻译整理自Stack Overflowhttp://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)
  • 1
  • 2
  • 3

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

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

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

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

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

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

/greeting/Mark
  • 1

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

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

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

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

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

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

现在就成了这样:

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

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

为何要多此一举

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

from flask import Flask, Blueprint
from admin import admin
from user import user app = Flask(__name__)
app.register_blueprint(admin, url_prefix='admin')
app.register_blueprint(user, url_prefix='user')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

admin.py:

admin = Blueprint('admin', __name__)

@admin.route('/greeting')
def greeting():
return 'Hello, administrative user!'
  • 1
  • 2
  • 3
  • 4
  • 5

user.py:

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

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

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

来发实例

from flask import Flask, url_for

app = 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():
pass with app.test_request_context('/'):
print (url_for('foo_view')) #/foo
print (url_for('bufar')) #/bar
# url_for('bar_view') will raise werkzeug.routing.BuildError
print (url_for('bar_view')) #端点bar_view是没有定义的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

程序运行结果

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

Flask中'endpoint'(端点)的理解的更多相关文章

  1. Flask中endpoint的理解

    在flask框架中,我们经常会遇到endpoint这个东西,最开始也没法理解这个到底是做什么的.最近正好在研究Flask的源码,也就顺带了解了一下这个endpoint 首先,我们看一个例子: @app ...

  2. Flask 中请求钩子的理解和应用?

    请求钩子是通过装饰器的形式实现的,支持以下四种:1,before_first_request 在处理第一个请求前运行2,before_request:在每次请求前运行3,after_request:如 ...

  3. FlASK中的endpoint问题

    先贴一点有关的flask代码,时间有限,我慢慢扩充 以下是flask源码中app.py中add_url_rule的代码. 主要是view_func  -- endpoint -- url 之间的对应关 ...

  4. flask中的endpoint、自定义转化器、与djnago中session区别、利用装饰器实现登录认证

    flask路由中的endpoint 与自定义转化器 ''' endpoint主要用于 反向解析, 例如:login函数中配的路由是/login,其中endpoint='lg' 则在其他函数,可以用 u ...

  5. USB:USB通信中的端点(endpoint)和四种传输模式

    USB的传输模式有4种,分别是控制传输(Control Transfer).中断传输(Interrupt Transfer).批量传输或叫块传输(Bulk Transfer).实时传输或叫同步传输(I ...

  6. flask中url_for使用endpoint和视图函数名

    在flask中,使用url_for 进行路由反转时,需要传递一个endpoint的值,用法如下: @app.route('/', endpoint='my_index') def index(): r ...

  7. flask中的蓝图与红图

    内容: 1.flask中的蓝图 2.flask子域名实现 3.flask中的红图 1.flask中的蓝图 一个大型项目中视图比较多,如果仅仅是写在app.py中不方便管理,蓝图就可以做到分功能分目录结 ...

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

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

  9. Flask(2)- 装饰器的坑及解决办法、flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件、重定义错误页面)

    一.装饰器的坑以及解决方法 1.使用装饰器装饰两个视图函数,代码如下 from flask import Flask, redirect, render_template, request, sess ...

随机推荐

  1. 关于PHP中的 serialize () 和 unserialize () 的使用(即关于PHP中的值与已存储的表示的相互转换)

    有时,我们会碰到这样的数据(字符串) 1 a:3:{i:0;s:44:"/Uploads/images/2017-07-21/5971a9a08ad57.png";i:1;s:44 ...

  2. 【转载】.NET 开发者必备的工具箱

    本文作者Spencer是一名专注于ASP.NET和C#的程序员,他列举了平时工作.在家所使用的大部分开发工具,其中大部分工具都是集中于开发,当然也有一些其它用途的,比如图片处理.文件压缩等. 如果你是 ...

  3. hibernate annotation多对多中间表添加其他字段的第三种方法

    本示例主要以学生(T_Student)和课程(T_Course)之间的多对多关系,中间表Score(分数),学生表和课程表是多对多关系,另外为他们的关系添加额外的字段---分数: T_Student类 ...

  4. 原生js--insertAdjacentHTML

    insertAdjacentHTML是IE浏览器提供向DOM中插入html字符串的方法,字符串会自动生成在DOM树中. 其调用方式为elem.insertAdjacentHTML( position, ...

  5. python的高级特性:切片,迭代,列表生成式,生成器,迭代器

    python的高级特性:切片,迭代,列表生成式,生成器,迭代器 #演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] ...

  6. openstack 中镜像状态详解 Image Statuses

    Images in Glance can be in one the following statuses: queued The image identifier has been reserved ...

  7. ELK系列三:Elasticsearch的简单使用和配置文件简介

    1.定义模板创建索引: 首先定义好一个模板的例子 { "order":14, "template":"ids-1", "state ...

  8. visual studio 2013设置背景图片

    今天听了公司的一个经验分享会,发现VS竟然可以设置背景图片!还是个萌妹子!!被萌了一脸鼻血!!! 设置方法很简单:安装扩展ClaudiaIDE 1.在这里下载扩展,https://visualstud ...

  9. Jmeter与Jenkins结合进行Web接口测试

    纯通过Jmeter的界面进行Web的接口测试,效率低下.为此将Jmeter的接口测试与Jenkins联合,实现持续集成.配置完成后,只需修改运行的Jmeter脚本即可,运行结束后测试结果发送到指定邮箱 ...

  10. ABP之项目的搭建

    ABP是一个非常优秀的框架,使用模块化的管理方式,将当前比较优秀的技术集成到了这个框架中,方便开发者快速搭建自己的网站.作为ABP学习的第一篇,先将ABP框架跑起来看看再说. 1.首先需要去官网下载相 ...