web服务器的工作过程
- 创建 listen socket, 在指定的监听端口, 等待客户端请求的到来
- listen socket 接受客户端的请求, 得到 client socket, 接下来通过 client socket 与客户端通信
- 处理客户端的请求, 首先从 client socket 读取 http 请求的协议头, 如果是 post 协议, 还可能要读取客户端上传的数据, 然后处理请求, 准备好客户端需要的数据, 通过 client socket 写给客户端
案例
#!/usr/bin/env Python #coding:utf-8import tornado.httpserver import tornado.ioloop import tornado.options import tornado.webfrom 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 ')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()
- tornado.httpserver:这个模块就是用来解决 web 服务器的 http 协议问题,它提供了不少属性方法,实现客户端和服务器端的互通。Tornado 的非阻塞、单线程的特点在这个模块中体现。
- tornado.ioloop:这个也非常重要,能够实现非阻塞 socket 循环,不能互通一次就结束呀。
- tornado.options:这是命令行解析模块,也常用到。
- tornado.web:这是必不可少的模块,它提供了一个简单的 Web 框架与异步功能,从而使其扩展到大量打开的连接,使其成为理想的长轮询。
import tornado.ioloop import tornado.webclass MainHandler(tornado.web.RequestHandler):def get(self):self.write("Hello, world")def make_app():return tornado.web.Application([(r"/", MainHandler),])if __name__ == "__main__":app = make_app()app.listen(8888)tornado.ioloop.IOLoop.current().start()
建立一个目录,在这个目录中建立一些子目录和文件。
- handlers:在这个文件夹中放后端 Python 程序,主要处理来自前端的请求,并且操作数据库。
- methods:准备放一些函数或者类,比如用的最多的读写数据库的函数,这些函数被 handlers 里面的程序使用。
- statics:准备放一些静态文件,比如图片,css 和 javascript 文件等。
- templates:放模板文件,都是以 html 为扩展名的,它们将直接面对用户。
url.py
#!/usr/bin/env Python # coding=utf-8 """ the url structure of website """from handlers.index import IndexHandlerurl = [(r'/', IndexHandler), ]
application.py 文件
#!/usr/bin/env Python # coding=utf-8from url import urlimport tornado.web import ossettings = dict(template_path = os.path.join(os.path.dirname(__file__), "templates"),static_path = os.path.join(os.path.dirname(__file__), "statics"))application = tornado.web.Application(handlers = url,**settings)
server.py 文件
#!/usr/bin/env Python # coding=utf-8import tornado.ioloop import tornado.options import tornado.httpserverfrom application import applicationfrom tornado.options import define, optionsdefine("port", default = 8000, help = "run on the given port", type = int)def main():tornado.options.parse_command_line()http_server = tornado.httpserver.HTTPServer(application)http_server.listen(options.port)print ("Development server is running at http://127.0.0.1:%s" % options.port)print ("Quit the server with Control-C")tornado.ioloop.IOLoop.instance().start()if __name__ == "__main__":main()