Tornado概览
tornado吧
全部回复
仅看楼主
level 7
cloveses 楼主
FriendFeed’s web server 使用Python语产的简洁、非阻塞WEB服务。FriendFeed应用由像web.py或Google's webapp的WEB框架写成,而且应用高级的非阻塞 web server。
Tornado是开源版本的web服务器,其中使用了FriendFeed应用的一些工具。因非阻塞而快速,而区别于绝大多数主流web服务器框架(当然包括Python 框架)。它使用epoll或kqueue。 经典“Hello World”如下:import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
....def get(self):
........self.write("Hello, world")
application = tornado.web.Application([
....(r"/", MainHandler),
])
if __name__ == "__main__":
....application.listen(8888)
....tornado.ioloop.IOLoop.instance().start()尽量减少了模块依赖,理论上说在你的项目中可以独立的使用其中任何模块。请求处理器 和 请求参数Tornado将URL或URL模式映射到tornado.web.RequestHandler的子类。这些类中定义get()或post()方法来处理URL的HTTP GET或POST请求。下例中将根URL/映射到MainHandler,将URL模式 /story/([0-9]+)映射到StoryHandler。正则表达式组作为参数传给RequestHandler方法:
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("You requested the main page")
class StoryHandler(tornado.web.RequestHandler):
....def get(self, story_id):
........self.write("You requested the story " + story_id)
application = tornado.web.Application([
....(r"/", MainHandler),
....(r"/story/([0-9]+)", StoryHandler),
])
2013年05月09日 08点05分 1
level 7
cloveses 楼主
可以使用get_argument()方法获取get和post请求的参数。class MyFormHandler(tornado.web.RequestHandler):
....def get(self):
........self.write('<html><body><form action="/myform" method="post">'
........'<input type="text" name="message">'
........'<input type="submit" value="Submit">'
........'</form></body></html>')
....def post(self):
........self.set_header("Content-Type", "text/plain")
........self.write("You wrote " + self.get_argument("message"))上传文件被保存在self.request.files(字典)中,其内容:{"filename":..., "content_type":..., "body":...}如果要发送一个错误响应给客户端,如未认证403错误,可以引发一个tornado.web.HTTPError异常:if not self.user_is_logged_in():
raise tornado.web.HTTPError(403)
请求处理处理器可以访问self.request代表当前请求的对象。HTTPRequest对象包括一些有用的属性: arguments:所有的get和post参数。files:所有上的的文件(通过multipart/form-data POST请求)path:请求路径(问号之前的所有内容)headers:请求头
2013年05月10日 14点05分 2
level 7
cloveses 楼主

重载请求处理器(RequestHandler)方法
当需要时可以在子类中重载除了get()、post()等方法之外的其它几个方法。对于每个请求,一系列的方法调用:
1、每个请求,创建一个新的RequestHandler对象。
2、执行initialize()方法,还可以带有在Application中配置的参数。一般用于将参数保存至其成员变量中,它不用来产生输出信息或进行方法调用。
3、执行prepare()方法。可以用以在回应客户端之前输出相关信息,甚至结束应答(调用finish(),send_error())。
4、执行HTTP方法:get(),post(),put()等。如果URL正则表达式包含捕获组,将作为参数传其中。
5、请求结束时,执行on_finish()。对于同步的处理器,在get()方法之后,会立即执行;异步的,则在执行finish()之后调用。
下面是一个initialize()应用实例:
class ProfileHandler(RequestHandler):
....def initialize(self, database):
........self.database = database
....def get(self, username):
.......
app = Application([
....(r'/user/(.*)', ProfileHandler, dict(database=database)),
....])
还有一些经常重载的方法:
write_error(self, status_code, exc_info=None, **kwargs):错误发生时输出的HTML
get_current_user(self):用于登录验证,下文有提到。
get_user_locale(self):返回当前用的本地化语言配置对象。
get_login_url(self):当方法被@authenticated装饰时 返回登录URL(可以在Application中配置URL)
get_template_path(self):返回模板文件的目录
set_default_headers(self):设置应答的头部信息。
2013年05月11日 00点05分 4
1