某大佬仿flask写的web框架

web_frame.py

from werkzeug.local import LocalStack, LocalProxy

def get_request_context():
return request_context_stack.top request_context_stack = LocalStack()
request = LocalProxy(get_request_context) class APP(object): def __init__(self):
self.route_map = {}
self.before_request_functions = []
self.after_request_functions = [] def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response) def route(self, url):
def wrapper(func):
self.route_map[url] = func
return func
return wrapper def before_request(self, func):
def wrapper(*args, **kwargs):
self.before_request_functions.append(func)
return func
return wrapper() def after_request(self, func):
def wrapper(*args, **kwargs):
self.after_request_functions.append(func)
return func
return wrapper() def preprocess_request(self):
for func in self.before_request_functions:
func() def process_response(self):
for func in self.after_request_functions:
func() def wsgi_app(self, environ, start_response):
request_context_stack.push(environ)
url = environ['PATH_INFO']
func = self.route_map.get(url)
if not func:
start_response('404 NOT FOUND', [('Content-type', 'text/plain')])
return ['Page dose not exists!']
self.preprocess_request()
ret = func()
self.process_response()
start_response('200 OK', [('Content-Type', 'text/html')])
return ret def run(self, host='0.0.0.0', port=8888):
from werkzeug.serving import run_simple
run_simple(host, port, self)

app.py

import json
from web_frame import APP
from web_frame import request app = APP() @app.before_request
def test_before_request_1():
print('this is test_before_request_1, ---------------------') @app.before_request
def test_before_request_2():
print('this is test_before_request_2, ---------------------') @app.after_request
def test_after_request_1():
print('this is after_before_request_1, ---------------------') @app.after_request
def test_after_request_2():
print('this is after_before_request_2, ---------------------') @app.route('/a')
def a():
ret = {
'error_code': '',
'msg': 'success',
'data': 'this is a'
}
return json.dumps(ret) @app.route('/b')
def b():
print(request)
ret = {
'error_code': '',
'msg': 'success',
'data': 'this is b'
}
return json.dumps(ret) if __name__ == '__main__':
app.run()

对理解flask的请求流程有一定帮助

仿flask写的web框架的更多相关文章

  1. 读《架构探险——从零开始写Java Web框架》

    内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...

  2. 【EatBook】-NO.3.EatBook.3.JavaArchitecture.2.001-《架构探险:从零开始写Java Web框架》-

    1.0.0 Summary Tittle:[EatBook]-NO.3.EatBook.3.JavaArchitecture.2.001-<架构探险:从零开始写Java Web框架>- S ...

  3. 【Flask】微型web框架flask大概介绍

    Flask Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持 ...

  4. 从零写Java Web框架——实现Ioc依赖注入

    大概思路 通过读取配置文件,获取框架要加载的包路径:base-package,类似于 Spring 配置文件中的: <context:component-scan base-package=&q ...

  5. 《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书

    这书适合我. 哈哈,结合 以前的知识点,勉强能看懂. 讲得细,还可以参照着弄出来. 希望能坚持 完成啦... 原来,JSTL就类似于DJANGO中的模板. 而servlet类中的res,req,玩了D ...

  6. 测试Flask+PYTHON的WEB框架

    参数URL: http://blog.csdn.net/qwiwuqo/article/details/8970621 安装flask之前,你必须要先安装python和easy_install. 安装 ...

  7. 从零写Java Web框架——请求的处理DispatcherServlet

    大概思路 继承 HttpServlet,实现 DispatcherServlet,拦截所有请求: DispatchServlet 重写 init()方法,负责初始化框架: 重写 service()方法 ...

  8. 架构探险——从零开始写Java Web框架》第二章照作

    沉下来慢慢看实现了. 越来越觉得可以和DJANGO作对比. package org.smart4j.chapter2.model; /** * Created by sahara on 2016/3/ ...

  9. 自己动手写web框架----2

    在上一节,我们自己写的web框架,只能运行显示一个HelloWorld.现在我们对其进行一次加工,让他至少能运行一个登陆程序. 首先看login.jsp <%@ page contentType ...

随机推荐

  1. nboot,eboot和uboot

    nboot,eboot和uboot三者均为bootloader. ----nboot是samsung系列cpu为了能将前4KB程序复制到SRAM中运行,而在wince写的.nboot很小(4k左右), ...

  2. vijos 1243 生产产品

    貌似两年前联赛复习的时候就看过这题 然而当时大概看看了 感觉太难 便没有去做 如今再去做的时候 发现其实也并不容易 ------------------------------------------ ...

  3. jmeter 测试结果分析术语

    label:定义http请求名称. samples:测试中一共发出的请求. average:平均响应时长.默认是单个request的平均响应时长. median:中位数,50%用户的响应时长. 90% ...

  4. jmeter添加自定义扩展函数之Strng---base64解密

    1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...

  5. appium常见问题07_appium输入中文无效

    前几天在appium android自动化测试过程中,使用send_keys()输入中文,发现只能输入字母和数字,输入中文无反应. 大家是否同样遇到过该问题,当大家同样遇到该问题时,在配置参数desi ...

  6. 【设计模式】FactoryPattern工厂模式

    Factory Pattern 简单工厂模式 将变化的部分封装起来 //简单工厂 class SimpleProductFactory{ Product createProduct(String ty ...

  7. LR 场景设置

    LR 场景设置group:多个脚本按照独立设置模式跑,各个脚本可以单独设置虚拟用户.运行时间scenario:多个脚本之间按照相同模式跑,将总的虚拟用户数按照一定比例分配给各个脚本 schedule ...

  8. ZR-19CSP-S赛前冲刺

    ZR-19CSP-S赛前冲刺 1 ZR-19CSP-S赛前冲刺 2 ZR-19CSP-S赛前冲刺 3 ZR-19CSP-S赛前冲刺 4 ZR-19CSP-S赛前冲刺 5 ZR-19CSP-S赛前冲刺 ...

  9. 调试Xamarin.Android时出现缺少"Mono.Posix 2.0.0"的错误

    1.在http://originaldll.com/file/mono.posix.dll/31191.html中下载mono.posix 2.0.0 dll 2.以管理员权限运行Visual Stu ...

  10. Vue中组件间传值常用的几种方式

    版本说明: vue-cli:3.0 一.父子组件间传值 1.props/$emit -父组件==>>子组件: 子组件中通过定义props接收父组件中通过v-bind绑定的数据 父组件代码 ...