DispatcherMiddleware作用

  实现多app的应用,完成路由分发的功能

如何使用

from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
from flask import Flask, current_app,request app1 = Flask('app01') app2 = Flask('app02') @app1.route('/index/')
def index():
return "app01" @app2.route('/index2/')
def index2():
"""
存在的问题:
def __call__(self, environ, start_response):
# 获取当前请求的URL,script == '/index/'
script = environ.get('PATH_INFO', '')
path_info = ''
# '/' 在 '/index/' 中
while '/' in script:
# self.mounts == {'/sec': app2,}, '/' 不在 self.mounts 中
if script in self.mounts:
app = self.mounts[script]
break
script, last_item = script.rsplit('/', 1)
path_info = '/%s%s' % (last_item, path_info)
else:
app = self.mounts.get(script, self.app)
original_script_name = environ.get('SCRIPT_NAME', '')
environ['SCRIPT_NAME'] = original_script_name + script
environ['PATH_INFO'] = path_info # 这里得到的知识不包含前缀的url,那这样不是就丢失了吗
return app(environ, start_response)
:return:
"""
print(request.full_path) # 得到的是 /index2/? 且没有request.path_info
return "app2" # http://www.oldboyedu.com/index
# http://www.oldboyedu.com/sec/index2
dm = DispatcherMiddleware(app1, {
'/sec': app2,
}) if __name__ == "__main__":
run_simple('localhost', 5000, dm)

注意事项:

  在DispatcherMiddleware类的实例参数中,第一个参数不能是一个字典,即第一个参数只能是一个app实例,即没有前缀的。但是后面的APP实例都可以是有前缀的app,存放至字典中

源码分析

请求每次进来执行DispatcherMiddleware的__call__方法,实现分发的原理是:获取本次请求的url,对url进行分割,直到分割出来的部分url(前缀)在保存了分发路由关系字典的self.mounts中时,分割结束,根据前缀找到要执行的函数,并做后续的操作。

flask源码解析之DispatcherMiddleware的更多相关文章

  1. flask源码解析之上下文为什么用栈

    楔子 我在之前的文章<flask源码解析之上下文>中对flask上下文流程进行了详细的说明,但是在学习的过程中我一直在思考flask上下文中为什么要使用栈完成对请求上下文和应用上下文的入栈 ...

  2. flask源码解析之上下文

    引入 对于flask而言,其请求过程与django有着截然不同的流程.在django中是将请求一步步封装最终传入视图函数的参数中,但是在flask中,视图函数中并没有请求参数,而是将请求通过上下文机制 ...

  3. Flask源码解析:Flask应用执行流程及原理

    WSGI WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述服务器端如何与web应用程序通信的 ...

  4. flask 源码解析:上下文(一)

    文章出处  https://www.cnblogs.com/jackchengcc/archive/2018/11/29/10025949.html 一:什么是上下文 每一段程序都有很多外部变量.只有 ...

  5. flask源码解析之session

    内容回顾 cookie与session的区别: 1. session 是保存在服务端的键值对 2. cookie 只能保存4096个字节的数据,但是session不受限制 3. cookie保存在浏览 ...

  6. Flask源码解析:Flask上下文

    一.上下文(Context) 什么是上下文: 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行, ...

  7. 用尽洪荒之力学习Flask源码

    WSGIapp.run()werkzeug@app.route('/')ContextLocalLocalStackLocalProxyContext CreateStack pushStack po ...

  8. Flask之 请求,应用 上下文源码解析

    什么是上下文? 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行,就要给所有的外部变量一个一个写 ...

  9. Flask源码学习—config配置管理

    自己用Flask做了一个博客(www.hbnnlove.sinaapp.com),之前苦于没有对源码解析的文档,只能自己硬着头皮看.现在我把我自己学习Flask源码的收获写出来,也希望能给后续要学习F ...

随机推荐

  1. 【转】跨DLLnew delete问题

    转两篇文章来说这个问题的 链接1:https://blog.csdn.net/notebook2001a/article/details/6647850 链接2:https://blog.csdn.n ...

  2. leetcode: Longest Valid Parentheses分析和实现

    题目大意:给出一个只包含字符'('和')'的字符串S,求最长有效括号序列的长度. 很有趣的题目,有助于我们对这种人类自身制定的规则的深入理解,可能我们大多数人都从没有真正理解过怎样一个括号序列是有效的 ...

  3. 完全使用ASP.NET实现的省市区级联效果

    本功能特点:下级的显示和数据的加载都是由上一级下拉框的SelectedIndexChanged触发的,在上级下拉框没有选择之前,下级不会出现,用户体验比较好.无刷新方面,采用AJAX技术,在数据选择的 ...

  4. Linux汇编与C互相调用

    一.简介 C语言调用汇编有两种方式:1.通过内嵌汇编  2.通过编译链接. 二.基础知识 对于C和汇编语言的接口主要有两个问题需要解决 1.调用者与被调用者的参数传递 正常的,定义一个函数总是希望它完 ...

  5. 成为一名自由UX设计师--你“够格”吗?

    和传统的朝九晚五,三点一线的生活状态相比,现在互联网时代下的年轻人更崇尚对自由的追求.“可任意支配时间”.“工作场所自由”和“收入高”是人们选择成为自由职业者的主要原因.特别是IT行业中的设计师群体, ...

  6. python 命令行工具 fire

    简介 A library for automatically generating command line interfaces. Python Fire is a library for auto ...

  7. android,gridview

    package com.wes.gridview; import java.util.List; import android.content.Context; import android.cont ...

  8. UVaLive 4043 Ants (最佳完美匹配)

    题意:给定 n 个只蚂蚁和 n 棵树的坐标,问怎么匹配使得每个蚂蚁到树的连线不相交. 析:可以把蚂蚁和树分别看成是两类,那么就是一个完全匹配就好,但是要他们的连线不相交,那么就得考虑,最佳完美匹配是可 ...

  9. (网络流)Food -- hdu -- 4292

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4292 Food Time Limit: 2000/1000 MS (Java/Others)    Me ...

  10. The Scope Chain

    JavaScript is a lexically scoped language: the scope of variable can be thought of as the set of sou ...