Flask中'endpoint'(端点)的理解
翻译整理自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个参数依次是rule、view_func、endpoint.
假设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'(端点)的理解相关推荐
- flask中关于endpoint端点、url_map映射、view_func视图函数,view_functions、及视图函数名是否何以相同的问题?
视图函数中关于url_map视图的映射:应该是[ url->methonds->endpoint ] 而整个请求的过程,是先通过url地址映射到端点endpoint,然后通过endpo ...
- Flask中路由系统以及蓝图的使用
一.Flask的路由系统 1.@app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route("/info", methods=[ ...
- flask开发桌面应用程序_使用Microsoft Authenticatio将多个破折号应用程序嵌入Flask中...
flask开发桌面应用程序 Full disclosure: I am not an expert in developing web applications. I don't even consi ...
- USB开设备开发学习之三:USB中的端点详细了解
原文:https://blog.csdn.net/go_str/article/details/80985717 前言 端点在实际的USB通讯过程种的具体作用与含义十分重要,但是有些难以理解, ...
- USB中的端点详细了解
/*********************************************************************** USB入门系列: 1.USB行业标准介绍 2.USB具 ...
- Flask中的其他控件
Day04 1.分页器方法 分页器BaseQuery.paginate()pageper_pageFalsePaginationitemspages获取总页数prev_num上一页的页码has_pre ...
- Flask中路由使用解析
Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...
- Flask中的CBV
Flask中的CBV 在Flask中和Django一样有两种视图模式,一种是基于函数,一种是基于类.下面来讨论一下Flask的CBV模式. 首先,说明一下flask视图函数注册路由的本质: 其实,ro ...
- USB中的端点详细了解(转)
原文链接: http://www.360doc.com/content/19/0806/08/7551_853249151.shtml 前言 端点在实际的USB通讯过程种的具体作用与含义十分重要,但是 ...
最新文章
- Linux RSS/RPS/RFS/XPS对比
- [转]url传递中文的解决方案总结
- spring boot项目配置RestTemplate超时时长
- 这家AI公司用面具破解中国人脸识别系统!微信、支付宝、火车站无一幸免
- 第十五节:Asp.Net Core MVC和WebApi路由规则的总结和对比-第二十节
- C/C++入门的精髓!太全了吧,收藏夹的必备
- a start job is running for延迟90s的解决办法
- 直播电商只能卖便宜货吗?
- jenkins java jar_Jenkins 安装和配置、启动jar包
- RocketMQ学习-概览
- python3 与python2 异常处理的区别与联系
- wpe封包修改服务器数据,wpe 封包 数据包 修改实例
- 打开本地计算机策略,win7本地组策略打开方法介绍
- 迅睿CMS插件自动采集伪原创免费插件
- 从gitlab迁移到极狐gitlab的方法 #JIHULAB101
- 计算机二级第二课堂学记录表,第二课堂学分/第二课堂学分是什么?大学第二课堂学分不够...
- 简单版的相似图片搜索原理
- TextView(显示文本)
- 用canvas画布绘制扇形和弧线
- 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA
热门文章
- Ins照片墙下载工具:4K Stogram for Mac
- java 刷新jtextarea,SwingPropertyChangeSupport动态更新JTextArea
- 解决Photoshop CS6在window10中窗口字体太小问题
- 毕业设计 基于单片机的智能音响设计与实现 -物联网 嵌入式 stm32
- Linux vim 文本替换 %s/原文/替换文本/g
- 目标检测——day66 Scaled-YOLOv4: Scaling Cross Stage Partial Network
- Microsoft SQL Server 2000 Service Pack 3a
- windows 完成端口
- 算法竞赛入门经典——训练指南
- git导入项目时,git出现10054错误