您的位置:首页 > 产品设计 > UI/UE

tornado用户指引(七)------Tornado web应用程序结构(二)之RequestHandler

2016-05-05 00:05 441 查看
继承RequestHandler

基于tornado的web应用程序很多功能都是由RequestHandler的子类完成的。

当需要处理一个HTTP请求时,RequestHandler子类的对应方法get(),post()将会被调用。所以,每个子类将会实现这些方法以处理不同的HTTP请求。

如上篇文章中所说/article/8375744.html 这些方法被调用时将会传递一些参数,如果URL path中匹配到的模式。

在子类里面,我们可以使用RequestHandler.render或者RequestHandler.write来产生HTTP响应。

render方法会加载传入的模板并用传入的参数渲染页面。

write方法用于不是基于模板的响应,它可以接受字符串,字节流或者字典作为参数(字典参数会被转化为JSON)。

RequestHandler里的许多方法都被设计为是可以被子类覆盖的,这些方法会被应用程序框架使用。常见的用法是定义一个继承自RequestHandler的子类BaseHandler,然后在

BaseHandler里覆盖write_error,get_current_user这些公用的方法。然后实际的业务逻辑处理类再继承这个BaseHandler类。

处理Request输入:

RequestHandler可以通过self.request来访问当前正在处理的请求对象。你可以通过查看HTTPSeverRequqest的定义来查看可以访问的属性。

框架会为你解析好Request请求中的HTML数据,你可以通过get_query_argument和get_body_qrgument方法来访问所需数据。

例子:

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_body_argument("message"))

由于HTML表单编码的二义性,因此无法确认一个参数名称对应的是一个单值还是一个列表。RequestHandler提供了不同的方法来区分程序是想获得一个单值还是一个列表。

要获取列表,需要使用get_query_arguments和get_body_qrguments方法。

通过表单上传的文件可以通过self.request.files获取到,它是一个名字(在HTML的input type="file"中指定)到文件对象列表的映射。每个文件对象是一个形如下面的字典:

{"filename":..., "content_type":..., "body":...}

文件对象只有在文件是通过multipart/form-data这种表单属性上传时才能访问。

如果没有设置这个属性,原始的二进制数据可以通过self.request.body访问。默认情况下,上传的文件数据全部缓存在内存中,如果文件很大或者需要节省内存

可以查看使用stream_request_body这个类装饰器。

由于HTML表单数据格式多种多样(比如上面提到的二义性参数)。tornado并不尝试统一数据格式,比如一般情况下,对于json格式并不处理。

应用程序需要处理JSON格式的数据,需要像下面这样覆盖prepare方法:

def prepare(self):
if self.request.headers["Content-Type"].startswith("application/json"):
self.json_args = json.loads(self.request.body)
else:
self.json_args = None
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: