flask 即插视图(Pluggable Views)和endpoint

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‘这样恶心的判断,其实也不错。

以上

Preference:

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

时间: 2024-09-30 15:42:32

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

Flask即插视图与tornado比较

由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执.刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变.今天看了Flask的源码和相关教程看到原来 Flask也可以写出和Tornado类似的代码结构--Flask即插视图. 代码如下: from functools import wraps from flask import Flask, request from flask.views import

网站后端_Python+Flask.0010.FLASK即插视图之自定义视图类及视图修饰?

即插视图; 说明: FLASK的视图灵感来自于DJANGO的基于类而非基于函数的通用视图,主要目的是为了解决多个视图函数之间已经实现的部分,通过类继承的方式继承到其它视图,总之为了一点,就是少写代码,然后通过add_url_rule让我们定义的视图类支持动态插入,也就是所谓的即插视图 深入视图: # 转换前: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # 51CTOBG: h

1.Flask URL和视图

1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name__) #url与视图映射 @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() #flask中的一个测试应用服务器 浏览器访问:http://127.0.0.1:5000/,也可以更改端口号:

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

实战:把ASP.NET MVC中的Views下面的视图放到Views文件夹外 园子里写的文章的都是把控制器从传统的项目中的Controllers拿出来单独放,但很少几乎没有把视图从Views拿出去这样的文章,今天来写一个. 今天学习MVC的时候,试着实现了一下,其实很简单!一步步解决问题就行了,下面记录如下,供需要的同学参考,写的不好,轻喷,谢啦 首先咱们自己建一个MyCustomView文件夹 下面建一个Home文件夹里面放Index.cshtml视图 删除原来Views/Home/Index

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

园子里写的文章的都是把控制器从传统的项目中的Controllers拿出来单独放,但很少几乎没有把视图从Views拿出去这样的文章,今天来写一个. 今天学习MVC的时候,试着实现了一下,其实很简单!一步步解决问题就行了,下面记录如下,供需要的同学参考,写的不好,轻喷,谢啦 首先咱们自己建一个MyCustomView文件夹 下面建一个Home文件夹里面放Index.cshtml视图 删除原来Views/Home/Index.cshtml 很明显这个时候访问Home/Index肯定会出现最经典的错误

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

运行在HoloLens上的应用可能包含2种视图,分别是全息视图和2D视图.应用可以在全息视图和2D视图之间转换.这频繁用于访问系统提供的接口,例如虚拟键盘.拥有至少一个全息视图的应用被归类为全息应用.不包含任何全息视图的应用则是2D应用. 全息视图 Holographic views 全息视图给予你在周边世界中创建全息图像的能力.当一个应用在全息视图中正在绘制时,同一时刻不会有其他应用也在绘制--来自多个应用的全息图像是互相不合成的.通过不断调整视角,使得你的应用渲染它的场景能够匹配用户头部的移

jQuery加载部分视图(Partial Views)

本篇是演示使用jQuery加载部分视图(Partial View).如果你不想使用Razor的语法呈现部分视图,那此篇的方法是最理想的了.它可以Render至指定的tag上. 创建两个部分视图,一个为_News.cshtml,内呈现的数据是一些静态数据,当然可以传入model,使用Razor来呈现. 另一个为_Article.cshtml: 添加控制器,第一个Action是为视图准备,而News()与Article() Action是返回PartialViewResult(),它们就是稍后我们视

SQL 视图(Views)

SQL 视图(Views) 视图是可视化的表. 本章讲解如何创建.更新和删除视图. SQL CREATE VIEW 语句 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 您可以向视图添加 SQL 函数.WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样. SQL CREATE VIEW 语法 CREATE VIEW view_name AS SELECT

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

阅读目录(Content) 视图层之视图函数(views) 一个简单的视图 1.HttpRequest 2.HttpResponse 1.render 函数 2.redirect 函数 对比render与redirect: 回到顶部(go to top) 视图层之视图函数(views) 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以.