3.1.2 Python代码分析

代开Python代码编辑器,编写下面代码:
#! /usr/bin/env python
#coding:utf-8

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define,options
define("port",default=8000,help="run on the given port",type=int)

class IndexHandler(tornado.web.RequestHandler):
def get(self):
greeting = self.get_argument('greeting','Hello')
self.write(greeting + ', welcome you to read: www.python.cn')

if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/",IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
保存为hello.py文件,然后在linux环境下(或者是windows环境下)执行:
$ python hello.py
用Python运行这个文件,其实这就算是已经发布了一个网站,只不过这个网站功能比较简单罢了。
打开浏览器:http://localhost:8000/
然后没问题的话,就会看到:

在linux环境下还可以这样访问:
或者
curl http:localhost:8000/?greeting=zhangsan
1,WEB服务器工作流程
网站都离不开Web服务器,这里指的是计算机里安装的软件
在Web上,用得最多的就是输入网址,访问某个网站。世界那么多网站网页,为了协调彼此,制定了很多通用的协议,其中http协议,就是网络协议中比较广泛的一种。
web服务器的工作可以用图来概括:

(1) 创建listen socket, 在指定的监听端口, 等待客户端请求的到来
(2) listen socket接受客户端的请求, 得到client socket, 接下来通过client socket与客户端通信
(3) 处理客户端的请求, 首先从client socket读取http请求的协议头, 如果是post协议, 还可能要
      读取客户端上传的数据, 然后处理请求, 准备好客户端需要的数据, 通过client socket写给客户端
2,解析代码
以上面代码为例,进行代码解析
a)引入代码
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
这四个都是Tornado的模块,在这都是必需的。这四个模块在一般开发中也常用到。
tornado.httpserver:这个模块用来解决Web服务器的http协议问题,它提供了不少属性方法,实现客户端和服务器端的互通。Tornado的非阻塞、单线程的特点在这个模块中体现。
tornado.ioloop:这个也非常重要,实现I/O循环,监听用户请求,然后映射具体的处理,再返给用户相应的结果。
tornado.options:这是命令行解析模块,也常用到。
tornado.web:这是必不可少的模块,它提供了一个简单的Web框架与异步功能,从而使其扩展到大量打开的连接,使其成为理想的长轮询。
还有一个模块的引入是通过from...import完成的。
from tornado.options import define,options
define("port",default=8000,help="run on the given port",type=int)
这两句就显示了所谓“命令行解析模块”的用途了。
通过tornado.options.define()定义了访问本服务器的端口,就是当在浏览器地址栏中输入http:localhost:8000的时候,才能访问本网站,因为http协议默认的端口是80,为了区分,在这里设置为8000
b)定义请求,处理类
class IndexHandler(tornado.web.RequestHandler):
def get(self):
greeting = self.get_argument('greeting','Hello')
self.write(greeting + ', welcome you to read: www.python.cn')
所谓“请求处理”程序类,就是要定义一个类,专门应付客户端向服务器提出的请求,服务器要有相应的程序来接收并处理这个请求,并且反馈某些信息
于是就在这定义了一个名叫IndexHandler的类(名字随便取,但是要符合命名规范,首字母大写)
类IndexHandler继承tornado.web.RequestHandler,其中再定义get()和post()两个在Web中应用最多的方法的内容。
在这只定义了一个get()方法
greeting=self.get_argument('greeting','Hello')的方式可以得到url中传递的参数,默认值为Hello接下来的那句self.write(greeting+',welcome you to read: www.python.cn‘)中,write()方法的主要功能是向客户端反馈信息。
c)main方法
tornado.options.parse_command_line(),这是在执行Tornado的解析命令行。在Tornado的程序中,只要import模块之后,就会在运行的时候自动加载,不需要了解细节,但是,在main()方法中如果有命令行解析,必须提前将模块引入。
d)Application类
app = tornado.web.Application(handlers=[(r"/",IndexHandler)])
将tornado.web.Application类实例化。这个实例化,本质上是建立了整个网站程序的请求处理集合,然后它可以被HTTPServer作为参数调用,实现http协议服务器访问。
Application类的__init__方法参数形式:
def __init__(self, handlers=None, default_host="", transforms=None,**settings):
pass
一般情况下,handlers是不能为空的,因为Application类要通过这个参数的值处理来自客户端的请求。例如在本例中,handlers=[(r"/",IndexHandler)],就意味着如果通过浏览器的地址栏输入根路径(http://localhost:8000就是根路径,如果是http://localhost:8000/file,就不属于根,而是一个子路径或目录了),对应着就是让IndexHandler类处理这个请求。
一定要注意通过handlers传入的数值格式:
handlers = [
(r"/", IndexHandlers), #来自根路径的请求用IndesHandlers处理
(r"/qiwsir/(.*)", QiwsirHandlers), #来自/qiwsir/以及其下任何请求
#QiwsirHandlers处理
]
在这里使用了r"/"的样式,意味着就不需要使用转义符,r后面的都表示该符号本来的含义。
e)HTTPServer类
实例化之后,Application对象(用app作为标签的)就可以被另外一个类HTTPServer引用:
http_server = tornado.httpserver.HTTPServer(app)
HTTPServer是tornado.httpserver里面定义的类。HTTPServer是一个单线程非阻塞HTTP服务器,执行HTTPServer一般要回调Application对象,并提供发送响应的接口
http_server.listen(options.port)
这个时紧跟上面的,这样就建立了单进程的http服务。
f)IOLoop类
tornado.ioloop.IOLoop.instance().start()
总是在__main()__的最后一句。
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011418530/article/details/79974577
个人分类: Python
所属专栏: 我的Python学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭