仿flask写的web框架
某大佬仿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框架的更多相关文章
- 读《架构探险——从零开始写Java Web框架》
内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...
- 【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 ...
- 【Flask】微型web框架flask大概介绍
Flask Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持 ...
- 从零写Java Web框架——实现Ioc依赖注入
大概思路 通过读取配置文件,获取框架要加载的包路径:base-package,类似于 Spring 配置文件中的: <context:component-scan base-package=&q ...
- 《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书
这书适合我. 哈哈,结合 以前的知识点,勉强能看懂. 讲得细,还可以参照着弄出来. 希望能坚持 完成啦... 原来,JSTL就类似于DJANGO中的模板. 而servlet类中的res,req,玩了D ...
- 测试Flask+PYTHON的WEB框架
参数URL: http://blog.csdn.net/qwiwuqo/article/details/8970621 安装flask之前,你必须要先安装python和easy_install. 安装 ...
- 从零写Java Web框架——请求的处理DispatcherServlet
大概思路 继承 HttpServlet,实现 DispatcherServlet,拦截所有请求: DispatchServlet 重写 init()方法,负责初始化框架: 重写 service()方法 ...
- 架构探险——从零开始写Java Web框架》第二章照作
沉下来慢慢看实现了. 越来越觉得可以和DJANGO作对比. package org.smart4j.chapter2.model; /** * Created by sahara on 2016/3/ ...
- 自己动手写web框架----2
在上一节,我们自己写的web框架,只能运行显示一个HelloWorld.现在我们对其进行一次加工,让他至少能运行一个登陆程序. 首先看login.jsp <%@ page contentType ...
随机推荐
- 出席分布式事务Seata 1.0.0 GA典礼
前言 图中那个红衣服的就是本人 什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 简单的说,就是一次大的操作由不同的小 ...
- vux使用方法
# 使用vux及vuex-i18n需要做的工作 ### 1.首先需要安装vux ### 2.需要安装vux-loader ### 3.需要安装vuex ### 4.需要安装vuex-i18n ### ...
- zabbix4.0部署
1.环境检查 uname -r getenforce systemctl status firewalld.service 2.设置解析,自建yum源(可选) /etc/hosts #!/bin/ba ...
- 使用Bochs学习硬件原理
什么是Bochs? 简单地说,Bochs是一款仿真软件,可以用软件的方式模拟硬件的工作.同类软件有Qemu,仿真软件与虚拟机(hypervisor)还不完全相同,仿真软件是完全软件模拟硬件,而虚拟机软 ...
- mybatis分页插件使用
一:导入依赖 <!--分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> < ...
- 隐藏父类方法的new和重写父类虚方法virtual的区别
一.代码 public class Parent { public void Method_A() { Console.WriteLine("Parent Method_A"); ...
- 阿里云 消息队列mq
使用阿里云消息队列 控制台地址:http://ons.console.aliyun.com/#/home/topic Demo: 支付消息mq工厂类: public class DfacePayCon ...
- 淘汰赛制_NOI导刊2010提高(01)
题目描述 淘汰赛制是一种极其残酷的比赛制度.2n名选手分别标号1,2,3,…,2^n-1,2^n,他们将要参加n轮的激烈角逐.每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第 ...
- C#设计模式V2(1)——单例模式
出自:https://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计 ...
- java nio socket使用示例
这个示例,实现一个简单的C/S,客户端向服务器端发送消息,服务器将收到的消息打印到控制台,并将该消息返回给客户端,客户端再打印到控制台.现实的应用中需要定义发送数据使用的协议,以帮助服务器解析消息.本 ...