"""
<axiner>声明:
(错了另刂扌丁我)
(如若有误,请记得指出哟,谢谢了!!!)
"""
Web application frameworks(网络应用框架),简称:web框架,用于构建web应用。
以下是<axiner>自制的一张简图:
工作原理简易说明:
1、web服务器(中间件)收到来自客户端(浏览器)的请求(request)
2、中间件对request做一些预处理或者直接response请求
3、再经路由系统查找对应的视图函数来处理请求
4、视图函数根据`业务逻辑控制`的需求将`模板`与`数据`进行渲染耦合
5、视图函数处理完返回响应给web服务器
6、web服务器将响应发送给客户端
大致就这样子哈...
web框架本质>>>其实就是socket
下面来构造一个简易的web框架
首先介绍总体结构>>>
minweb:
基于Python27-wsgiref自定义的简易web框架,
以下是框架目录,根据MVC模式构建...
=====================
minweb
│
│── controllers
│ └── __init__.py
│ └── index.py
│ └── ...
│
│── models
│ └── __init__.py
│ └── ...
│ └── ...
│
│── views
│ └── index.html
│ └── ...
│ └── ...
│
│── __init__.py
│
│── manage.py
│
│── urls.py
│
└ ─ README.md
只是简易浅谈
所以
示例中未使用数据库,也没有使用静态文件...
下面所有代码展示:
# manage.py/
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_server
from urls import URLS
def Runserver(environ,start_response):
start_response('200 OK' ,[('Content-Type', 'text/html')])
# wsgiref将请求封装到参数environ里,start_response参数为响应
# 获取用户url
url = environ['PATH_INFO']
if url in URLS.keys():
func_name = URLS[url]
ret = func_name()
else:
ret = '<h1>404<h1>'
return ret
def run():
httpd = make_server('', 8000, Runserver)
httpd.serve_forever()
if __name__=='__main__':
run()
# 对上代码简易说明:此可以说是控制整个程序运行的文件
# urls.py/
from controllers import index
URLS ={
'/': index.index,
'/new': index.new,
}
# 对上代码简易说明:此是路由系统,也就是路由映射,处理url与视图函数关系的
# controllers/index.py/
# -*- coding:utf-8 -*-
import os
import datetime
from jinja2 import Template
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# print os.path.join(BASE_DIR, 'views', 'index.html')
def index():
# 无jinja2的渲染
# f = open(os.path.join(BASE_DIR, 'views', 'index.html'), 'r')
# data = f.read()
# f.close()
# now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S %p')
# new_data = data.replace('{{ time }}',str(now_time))
# return new_data
# 使用jinja2渲染
f = open(os.path.join(BASE_DIR, 'views', 'index.html'), 'r')
result = f.read()
template = Template(result)
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S %p')
data = template.render(time=now_time)
return data.encode('utf-8')
def new():
new = 'hello new'
return new
# 对上代码简易说明:此便是重要的业务逻辑控制文件,处理模板与数据之间的渲染耦合
<!--# views/index.html/-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<div class="main" style="border: 1px dashed gray;width: 255px;height: auto">
<p>nowtime:</p>
<p> {{ time }}</p>
</div>
<div>
<h1>hello web</h1>
<div>this is foo</div>
</div>
</body>
</html>
# 对上代码简易说明:此是一个简易的模板
Uh-oh,
完了...