endpoint经常使用flask的人肯定不会面生。其实我一直没有关注过他是怎么寻址的,直到最近经常食用url_for这个函数才引起了我的注意。

url_for看源码感觉实现挺复杂的,我们姑且不在这里纠结看到这一句:

def url_for(endpoint, **values):
"""Generates a URL to the given endpoint with the method provided.

传入的第一个参数是endpoint,url_for函数会将挂在endpoint上面的viewfunction的url返回回来。

当我们在正常请求flask提供的函数的时候我们使用的寻址顺序是 url -> endpoint -> viewfunction

当我们在有viewfunction想知道url的时候 寻址顺序是 viewfunction -> endpoint -> url

而且当有一个蓝图被申明的时候,我们使用url_for要带上蓝图的名称例如:

ec_bp = Blueprint(
'ec',
__name__,
template_folder='templates',
static_folder='static')

一个蓝图是这样

那么要找到这个蓝图下面的视图函数使用url_for的时候要这样。

url_for('ec.endpoint')

方能够正常寻址。关于endpoint其他没有什么好说的了。

下面来看看flask的即插视图:

即插视图主要牵扯到两个方面的东西,首先我们要理解一个重要的概念。我们在flask中使用的装饰器路由地址与endpoint的绑定也可使用

add_url_rule函数进行路由绑定

    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
"""A helper method to register a rule (and optionally a view function)
to the application. The endpoint is automatically prefixed with the
blueprint's name.

这里喔拷贝了一个 bluepoint上面的add_url_rule方法过来,其实都差不多,这里直接使用bluepoint上面的该方法可以自动进行endpoint寻址不用使用前缀所以还比较方便。绑定路由就是rule写路由, endpoint写绑定的endpoint  然后view_func写使用哪个视图函数的名字。

这里即插视图在view_func上面一般使用类来做view_func,进行更灵活的管理。这样使用

class RenderTemplateView(View):
def __init__(self, template_name):
self.template_name = template_name
def dispatch_request(self):
return render_template(self.template_name)
app.add_url_rule('/about', view_func=RenderTemplateView.as_view(
'about_page', template_name='about.html'))

上面是官方文档上的一个例子将类RenderTemplateView使用as_view 作为视图函数 然后设置一个name 之后与/about的 url规则绑定在一起。

即插视图继承view 实现一个自己的dispatch_request的方法。 在执行这个视图的时候会执行dispath_request这个函数里的内容,这样就可以灵活运用这个特性。

另外 即插视图 还可以继承一个flask.view中的MethodView方法这样可以自动路由到对应的方法下面去执行函数。

from flask.views import MethodView

class UserAPI(MethodView):
def dispatch_request(self):
return super(UserAPI, self).dispatch_reqeust()
    
def get(self):
users = User.query.all()
... def post(self):
user = User.from_form_data(request.form)
... app.add_url_rule('/users/', view_func=UserAPI.as_view('users')

本来没有重写dispatch_request方法会调用继承自MethodView的 dispatch_request方法路由给指定的http方法对应的函数。

这里我们再特殊处理一下,重写父类的dispatch_reqeust方法先跑一波我们需要的逻辑,然后再调用父类的dispatch_request()方法来路由到指定的http方法上继续执行函数。而且,这里继续传递参数到父类的dispatch_reqeust方法上是没有问题的。想传还是可以传。

可以看到这样就避免了我们写恶心的 request.method == 'post'这样恶心的判断,其实也不错。

以上

Reference:

http://docs.jinkan.org/docs/flask/views.html  即插视图flask api中文文档

flask 即插视图(Pluggable Views)和endpoint的更多相关文章

  1. Flask即插视图与tornado比较

    由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执.刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变.今 ...

  2. 1.Flask URL和视图

    1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name__) #url与视图映射 @ ...

  3. python Flask框架CBV视图

    1.演示之前需要先写一个装饰器 # 装饰器 def wrapper(func): def inner(*args, **kwargs): print('操作函数%s之前' % func.__name_ ...

  4. 第三节:视图(Views)和模板(Templates)

    目录 概览 编写视图 编辑视图实际做一些事情 抛出404异常 使用模板系统 移除在代码中的硬编码网址 Url名称的命名空间 概览 视图是Django应用的网页的“类型”,一般服务于特定的功能并且有特定 ...

  5. 实战:ASP.NET MVC中把Views下面的视图放到Views文件夹外

    园子里写的文章的都是把控制器从传统的项目中的Controllers拿出来单独放,但很少几乎没有把视图从Views拿出去这样的文章,今天来写一个. 其实很简单!一步步解决问题就行了,下面记录如下,供需要 ...

  6. MVC中的Views下面的视图放到Views文件夹外

    实战:把ASP.NET MVC中的Views下面的视图放到Views文件夹外   园子里写的文章的都是把控制器从传统的项目中的Controllers拿出来单独放,但很少几乎没有把视图从Views拿出去 ...

  7. Django - - - -视图层之视图函数(views)

    视图层之视图函数(views) 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档 ...

  8. HoloLens开发手记 - HoloLens上的应用视图 App views on HoloLens

    运行在HoloLens上的应用可能包含2种视图,分别是全息视图和2D视图.应用可以在全息视图和2D视图之间转换,这常被用于访问系统提供的接口,例如虚拟键盘.拥有至少一个全息视图的应用被归类为全息应用. ...

  9. SQL 视图(Views)

    SQL 视图(Views) 视图是可视化的表. 本章讲解如何创建.更新和删除视图. SQL CREATE VIEW 语句 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列 ...

随机推荐

  1. Oracle Drop表并未直接删除 drop table xx purge

    drop表 执行drop table xx 语句     drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除.     通 ...

  2. Echo团队Alpha冲刺随笔 - 第四天

    项目冲刺情况 进展 前端:完成了差不多一半,小程序部分界面基本完工,WEB端也完成了一部分 后端:也完成了大半了 问题 后端文件上传还没解决 心得 进度还行,团队配合都还不错 今日会议内容 黄少勇 今 ...

  3. Visual studio 附加进程调试

    建一个WebApplication项目,并新增Default.aspx页面 新增一个IIS网站 打开页面,任务管理器启动了进程:w3wp.exe 附加进程,方式:VS-调试-附加进程 浏览器打开页面D ...

  4. Winform 基础二 最小化 最大化 关闭 点击任务栏隐藏显示 点击鼠标左键移动窗体

    一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 th ...

  5. 【Codeforces 710F】String Set Queries

    Codeforces 710 F 思路:KMP学的还是不过关啊... 按照字符串的长度分类,如果长度大于\(\sqrt{n}\)的就扔到什么地方等待查询,否则就扔进trie里面. 对于查询,我们先在t ...

  6. 【Topcoder 10384】KingdomMap

    Topcoder 10384 题意:给你一个森林,求是否能将这个森林的点集分成两部分,每部分放在一列中,要求边是直的并且不能交叉,问最少删哪几条边. 思路:我们考虑森林中的一棵树,以\(u\)为根,将 ...

  7. 读《Top benefits of continuous integration》有感

    看到一片文章<Top benefits of continuous integration>,这张图画的很棒.将整个CI流程各阶段,列举出来了. 作者在文章里面介绍了CI和TDD,以及采用 ...

  8. HTML5 读取上传文件(转载)

    另参考 http://www.jianshu.com/p/46e6e03a0d53 1 filelist对象与file对象: <input type="file" id=&q ...

  9. C#路径的八种相关操作,判断字符串是否为路径等

    原文:C#路径的八种相关操作,判断字符串是否为路径等 1.判定一个给定的C#路径是否有效,合法 通过Path.GetInvalidPathChars或Path.GetInvalidFileNameCh ...

  10. 查看MS Sqlserver文件大小语句

    1..查询数据库的数据文件及日志文件的相关信息(包括文件组.当前文件大小.文件最大值.文件增长设置.文件逻辑名.文件路径等) select * from [数据库名].[dbo].[sysfiles] ...