仿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': '0',
        'msg': 'success',
        'data': 'this is a'
    }
    return json.dumps(ret)


@app.route('/b')
def b():
    print(request)
    ret = {
        'error_code': '0',
        'msg': 'success',
        'data': 'this is b'
    }
    return json.dumps(ret)


if __name__ == '__main__':
    app.run()

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

原文地址:https://www.cnblogs.com/1a2a/p/11208724.html