Web框架
众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。上篇只是返回了一句话,如果是要返回一个图片呢?一个文件呢?这就涉及你自己要负责实现文件的传送了,要自己通过Socket把Http协议里的各种功能都实现,浪费时间。
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
1.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。
2.应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。
不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。
WSGI
WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。
python标准库提供的独立WSGI服务器称为wsgiref。通俗的说:当规范建立后,程序就不再重复编写web server(socket服务端),而是直接使用现成的实现WSGI的模块(例如:wsgiref、uwsgi、werkzeug),从而让程序员更加专注与业务代码。Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server。
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
""
当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等,即客户发来的所有数据
:param start_response: 响应相关 封装要返回给用户的数据,响应头状态""
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
2.7无字节 转3.x字节 必须把字符串转为字节
1.b'abc'
2.bytes('abc',encoding='utf-8')
3.'abc'.encode('utf-8')
if __name__ == '__main__': httpd = make_server('', 8000, RunServer)
ip 端口 自定义函数 print("Serving HTTP on port 8000...") httpd.serve_forever()
运行 自动创建Socket服务端 一旦连接上 会触发 RunServer
自定义Web框架
通过python标准库提供的wsgiref模块开发一个自己的Web框架
web server支持多页面
from wsgiref.simple_server import make_server def handle_index():"一类可以用正则作为函数,例如翻页" return 'index' def handle_login(): return 'login' def routers(): urlpatterns = ( ('/index/',handle_index), ('/login/',handle_login), ) return urlpatterns def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ['PATH_INFO'] ""从断点处拿到用户的url标识""
urlpatterns = routers() "url太多 放在一个列表里 不用一个一个写函数" func = None for item in urlpatterns: func = urlpatterns[item] if func: return func() else: return [bytes('404 not found.',encoding="utf-8"),
]
if __name__ == '__main__':
httpd = make_server('', 8000, RunServer)
print "Serving HTTP on port 8000..."
httpd.serve_forever()
函数显示页面,要调用html,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。
def index(): # return 'index' f = open('index.html') data = f.read() return data def login(): # return 'login' f = open('login.html') data = f.read() return data
View: 由于数据去各自的html中拿,html太多放在一个View文件夹中 f = open('View/index.html')
Controller: 放各个函数 from Controller import account 函数放在account.py
Model: 数据库相关 的文件夹
总结
web框架
MVC : Model 数据库 View模板文件 Controller 业务处理
MTV : Model 数据库 Template 业务处理 View模板文件
Web框架的本质
- 浏览器是socket客户端,网站是socket服务端
- wsgi,是一个规范,wsgiref实现了这个规范并在其内部实现了socket服务端
- 根据 url 的不同执行不同函数,即:路由系统
- 函数,即:视图函数
- 图片、css、js文件 统一称为静态文件,需要读取内容直接返回给用户浏览器