[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")

原文地址:https://www.cnblogs.com/iiiiiher/p/8253719.html