zoukankan      html  css  js  c++  java
  • [py]彻底细究web框架的wsgi+逻辑处理模块

    wsgi逻辑结构初探

    web框架 = wsgi+逻辑处理app

    接收请求,返回对应的内容

    python wsgiref实现了wsgi规范.

    from wsgiref.simple_server import make_server
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return "<h1>maotai</h1>"
    
    if __name__ == '__main__':
        httpd = make_server('', 8080, RunServer)
        print 'http://127.0.0.1:8080'
        httpd.serve_forever()
    

    访问http://127.0.0.1:8080

    打断点,看下wsgi给environ传了什么参数: 里面包含url

    实现不同的请求由不同的逻辑模块处理

    from wsgiref.simple_server import make_server
    
    def new():
        return "new"
    
    def bbs():
        return "bbs"
    
    urls = {
        "/new": new,
        "/bbs": bbs,
    }
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        
        # 获取url
        url = environ["PATH_INFO"]
        
        # 根据url路由
        if url == "/new":
            msg = new()
        elif url == "/bbs":
            msg = bbs()
        else:
            msg = "404"
        return msg
    
    
    if __name__ == '__main__':
        httpd = make_server('', 8080, RunServer)
        print("http://127.0.0.1:8080")
        httpd.serve_forever()
    

    优化urls写法

    from wsgiref.simple_server import make_server
    
    
    def new():
        return "new"
    
    
    def bbs():
        return "bbs"
    
    
    urls = {
        "/new": new,
        "/bbs": bbs
    }
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ["PATH_INFO"]
        # 当url在urls里时,获取到url对应的view名
        if url in urls.keys():
            func_name = urls[url]
            res = func_name()
        else:
            res = "404"
        return res
    
    
    if __name__ == '__main__':
        httpd = make_server('', 8003, RunServer)
        print("http://127.0.0.1:8003")
        httpd.serve_forever()
    
    

    将一整坨代码模块化-搞成mvc模式

    拆分有2个原因:

    • 项目大了,代码多了,拆分方便管理
    • 拆分模块化简化复用

    controller.py: 通过file操作,获取模板内容,返回

    def new():
        # return "index"
        f=open("./index.html",'r')
        tmpl = f.read()
        f.close()
        return tmpl
    
    def bbs():
        return "bbs"
    

    urls.py

    import controller
    urls={
        "/new":controller.new,
        "/bbs":controller.bbs,
    }
    
    

    start.py

    from wsgiref.simple_server import make_server
    from urls import urls
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ["PATH_INFO"]
        if url in urls.keys():
            msg = urls[url]()
        else:
            msg = "404"
        return msg
    
    
    if __name__ == '__main__':
        httpd = make_server('', 8003, RunServer)
        print "http://127.0.0.1:8003"
        httpd.serve_forever()
    
    

    template: 返回time到网页: 字符串replace



    index.html

    <body>
    here is maotai's bbs
    <h1>{{item}}</h1>
    </body>
    

    controller.py
    思路: 使用字符串替换方法替换html中的指定字符

    import os
    import time
    
    def bbs():
        f = open(os.path.join("views", "bbs.html"), 'r')
        html = f.read()
        f.close()
        html = html.replace("{{item}}", str(time.time()))
        return html
    

    template: 使用jinjia2渲染模板

    jinjia2使用参考

    controller.py: 使用jinjia2渲染(字符串替换思路一样,只不过在html里支持循环等语法.)

    import os
    from jinja2 import Template
    
    def bbs():
        f = open(os.path.join("views", "bbs.html"), 'r')
        html = f.read()
        f.close()
        tmp=Template(html)
        # 使用jinjia2渲染(字符串替换思路一样)
        html=tmp.render(name="maotai",user_list=['maotai','alice','cristin'])
        return html.encode("utf-8")
    

  • 相关阅读:
    Shell判断文件或目录是否存在
    linux使用wpa_supplicant手动配置wifi
    ubuntu更换apt源后依然搜索旧软件源下载失败问题
    在Ubuntu下解决E: 无法对目录 /var/lib/apt/lists/ 加锁的问题
    Bash中判断一个命令的输出结果是否为空
    [解决]/bin/bash^M: bad interpreter: No such file or directory
    【转】 使用 NetworkManager 命令行工具 nmcli
    【转】wpa_supplicant及wpa_cli使用方法
    [RK3288] Vendor Storage区域知识及探讨
    安装oracle 时“[INS-30014]无法检查指定的位置是否位于 CFS上”问题
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/8253719.html
Copyright © 2011-2022 走看看