zoukankan      html  css  js  c++  java
  • 仿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的请求流程有一定帮助

  • 相关阅读:
    徒手画个disk不容易啊。。。
    fast powf
    SSE sqrt还是比C math库的sqrtf快了不少
    Mongoose也是个大坑
    A tiny program to benchmark image transpose algorithms
    On extracting ops from LLVM backend
    Into concurrent LRU caching once again
    性能大坑
    多项式在线拟合神器
    Spark 1.6.1源码编译
  • 原文地址:https://www.cnblogs.com/1a2a/p/11208724.html
Copyright © 2011-2022 走看看