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渲染模板
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")