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方法来访问所需数据。
例子:
由于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方法:
基于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
相关文章推荐
- MySQL_Table_Sub_Query
- MySQL_Table_Union_Query_Alias
- UITableView中不同cell工厂化处理
- iOS中UIView半边圆角设置
- Leetcode #62. Unique Paths 路径搜寻 解题报告
- UVA 11039 Building designing
- hdu——1711Number Sequence(kmp专练)
- Java集合的Stack、Queue、Map的遍历
- UITableView 01
- 347. Top K Frequent Elements-获得前K高次元素
- UIWindow
- iOS开发报错CUICatalog: Invalid asset name supplied: (null)
- UI进阶 数据处理之文件读写
- Rescue HDU1242 (BFS+优先队列)
- FZU 2037 Maximum Value Problem【递推】
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 错误解决
- POJ 2524 Ubiquitous Religions
- 让多语言本地化变得更简单的Xcode插件——AMLocalizedStringBuilder
- 【arduino】通过Esp8266-01模块实现的WiFi通信(2)与电脑的连接和烧写
- "围观"设计模式(9)--创建型之创建者模式(Builder Pattern)