web服务器的工作过程
- 创建 listen socket, 在指定的监听端口, 等待客户端请求的到来
- listen socket 接受客户端的请求, 得到 client socket, 接下来通过 client socket 与客户端通信
- 处理客户端的请求, 首先从 client socket 读取 http 请求的协议头, 如果是 post 协议, 还可能要读取客户端上传的数据, 然后处理请求, 准备好客户端需要的数据, 通过 client socket 写给客户端
案例
#!/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 ') 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.web class 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 IndexHandler url = [ (r'/', IndexHandler), ]
application.py 文件
#!/usr/bin/env Python # coding=utf-8 from url import url import tornado.web import os settings = 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-8 import tornado.ioloop import tornado.options import tornado.httpserver from application import application from tornado.options import define, options define("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()