仿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 ...
随机推荐
- Go的struct
1. 前言 Go的struct声明允许字段附带Tag来对字段做一些标记. 该Tag不仅仅是一个字符串那么简单,因为其主要用于反射场景,reflect包中提供了操作Tag的方法,所以Tag写法也要遵循一 ...
- 汇编指令ADD
格式: ADD OPRD1,OPRD2 功能: 两数相加(不带进位) 例子: add ax,bx add ax,ax 解释:
- Asp.Net Core 第02局:Program
总目录 前言 本文介绍Program,它包含程序的入口Main方法.从这里开始... 环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 第一手:Program ...
- 重温《javascript高级程序设计》(第3版)
1.重温<JavaScript高级程序设计>(第3版) (一)重温<javascript高级程序设计>(第1-4章) (二)重温<JavaScript高级程序设计> ...
- 学习contiki需要知道的一些概念和注意事项
概念: 1.宏:所谓宏,就是一些命令组织在一起,作为一个单独命令完成一个特定任务.Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作 ...
- Linux用awk处理文本数据
awk -F',' -v OFS='\t' 'NR>1{print $1, $4, $6, $7}' demo2.csv | sort -t $'\t' -k 1 -r
- js 监听input 实现数据绑定
<!DOCTYPE html> <html> <head> <script> function checkField(val) { //alert(&q ...
- UVALive 4728 Squares(旋转卡壳)
Squares The famous Korean IT company plans to make a digital map of the Earth with help of wireless ...
- 【目录】sql server 进阶篇系列
随笔分类 - sql server 进阶篇系列 sql server 下载安装标记 摘要: SQL Server 2017 的各版本和支持的功能 https://docs.microsoft.com/ ...
- 使用api获取数据————小程序
使用api获取数据----小程序 onLoad: function (options) { //打开页面即执行. let that = this; wx.request({ //建立链接 url: ' ...