参考资料:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832648091917b035146084c43b05754ec9408dfaf000
http://linluxiang.iteye.com/blog/799163
https://blog.csdn.net/li_101357/article/details/52748323
https://www.python.org/dev/peps/pep-0333/
https://segmentfault.com/a/1190000008909201
1、Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。
2、Web应用的本质就是:
(1)浏览器发送一个HTTP请求;
(2)服务器收到请求,生成一个HTML文档;
(3)服务器把HTML文档作为HTTP响应的Body发送给浏览器;
(4)浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。
3、WSGI,即Web Server Gateway Interface,是Web服务器和Web应用程序之间或框架之间的通用接口标准。WSGI就像一座桥梁,桥梁的一端是服务端或网关端,另一端是应用端或者框架端,WSGI的作用就是在协议之间进行转化。WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。应用WSGI这样的统一接口,我们可以不关心TCP连接、HTTP原始请求和响应格式,只专心于业务逻辑的处理即可。有关WSGI的进一步理解,可参考前面给出的参考资料。
4、Python中WSGI接口定义非常简单,它只要求Web开发者实现一个函数application(),就可以响应HTTP请求。该函数接收2个参数:
(1)environ:一个包含所有HTTP请求信息的dict对象(后面详细介绍environ是什么东西,有哪些内容);
(2)start_response:一个发送HTTP响应的函数。
下面是我参考了参考资料1后的学习代码:
from wsgiref.simple_server import make_server
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
s = environ['PATH_INFO'][1:]
try:
with open(s + '.htm', 'r') as f:
s = f.read()
except:
s = 'no'
return s
def start():
# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print "Serving HTTP on port 8000..."
# 开始监听HTTP请求:
httpd.serve_forever()
if __name__ == '__main__':
start()
代码分析:
(1)在application()函数中,调用start_response发送HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()。start_response()函数接收两个参数:一个是HTTP响应码,一个是一组元祖列表list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。
通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。然后,函数的返回值将作为HTTP响应的Body发送给浏览器。
(2)有了WSGI(Web服务器和Web应用程序之间或框架之间的通用接口标准),我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML,通过start_response()发送Header,最后返回Body(HTTP响应格式)。整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,我们只负责在更高层次上考虑如何响应请求就可以了。
(3)而application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。
(4)Python内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现。
5、对于复杂的Web应用程序,光靠一个WSGI函数来处理还是太底层了,需要在WSGI之上再抽象出Web框架,进一步简化Web开发。比如参考资料1中提到的Flask就是比较流行的WEB框架。除了Flask,常见的Python Web框架还有:
Django:全能型Web框架;
web.py:一个小巧的Web框架;
Bottle:和Flask类似的Web框架;
Tornado:Facebook的开源异步Web框架。
6、Python的第三方模板库提供了WEB开发MVC(Model-View-Controller,中文名“模型-视图-控制器)模式中Model到View的数据传输方式。参考资料1中就Flask框架默认支持的jinja2模板库给出了示例代码。
7、我在Windows系统下学习Flask及模板时,用到了支持Visual Studio的ptvs插件(参见学习笔记1),该模块支持在VS开发环境下直接创建Flask Web Project,下图展示了项目结构:
其中,runserver.py作为启动文件,用于启动WEB服务。views.py用于定义网站的业务逻辑,包括主页、页面点击响应等。所有用到的网页模板需要放在templates目录下,而static目录下时包括页面样式、字体、javascript脚本文件等静态内容。ptvs插件在创建项目时会提供一些默认的页面模板、样式、字体、Java script脚本(包括jquery等)。基本上,我们只需根据自己的需要修改views.py及在templates下增加页面模板即可。
注:参考资料5中给出了IIS下部署Flask网站的步骤,还没有来的及学习。
一点疑问:
先看runserver.py的代码:
from os import environ
from FlaskWebProject2 import app
if __name__ == '__main__':
HOST = environ.get('SERVER_HOST', 'localhost')
try:
s = environ.get('SERVER_PORT', '5555')
print environ.values
PORT = int(s)
except ValueError:
PORT = 5555
app.run(HOST, PORT)
代码中通过environ.get函数获取系统环境变量来获取端口配置,但我尝试增加名为“SERVER_PORT”的环境变量来改变WEB服务端口,却没有成功,每次运行runserver.py后,端口总是默认的5555。不知道是哪里没做对?
今天就学习到这里吧,下一节从协程学起。