美文网首页Python从0到1我爱编程
(2018-05-26.Python从Zero到One)8、(T

(2018-05-26.Python从Zero到One)8、(T

作者: lyh165 | 来源:发表于2018-05-26 23:26 被阅读0次

    3.4 接口与调用顺序

    下面的接口方法是由tornado框架进行调用的,我们可以选择性的重写这些方法。

    1. initialize()

    对应每个请求的处理类Handler在构造一个实例后首先执行initialize()方法。在讲输入时提到,路由映射中的第三个字典型参数会作为该方法的命名参数传递,如:

    class ProfileHandler(RequestHandler):
        def initialize(self, database):
            self.database = database
    
        def get(self):
            ...
    
    app = Application([
        (r'/user/(.*)', ProfileHandler, dict(database=database)),
        ])
    
    

    此方法通常用来初始化参数(对象属性),很少使用。

    2. prepare()

    预处理,即在执行对应请求方式的HTTP方法(如get、post等)前先执行,注意:不论以何种HTTP方式请求,都会执行prepare()方法

    以预处理请求体中的json数据为例:

    import json
    
    class IndexHandler(RequestHandler):
        def prepare(self):
            if self.request.headers.get("Content-Type").startswith("application/json"):
                self.json_dict = json.loads(self.request.body)
            else:
                self.json_dict = None
    
        def post(self):
            if self.json_dict:
                for key, value in self.json_dict.items():
                    self.write("<h3>%s</h3><p>%s</p>" % (key, value))
    
        def put(self):
            if self.json_dict:
                for key, value in self.json_dict.items():
                    self.write("<h3>%s</h3><p>%s</p>" % (key, value))
    
    

    用post方式发送json数据时:

    day60_tornado-深入tornado-01.png

    用put方式发送json数据时:

    day60_tornado-深入tornado-02.png

    3. HTTP方法

    方法 描述
    get 请求指定的页面信息,并返回实体主体。
    head 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    post 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
    delete 请求服务器删除指定的内容。
    patch 请求修改局部数据。
    put 从客户端向服务器传送的数据取代指定的文档的内容。
    options 返回给定URL支持的所有HTTP方法。

    4. on_finish()

    在请求处理结束后调用,即在调用HTTP方法后调用。通常该方法用来进行资源清理释放或处理日志等。注意:请尽量不要在此方法中进行响应输出。

    5. set_default_headers()

    6. write_error()

    7. 调用顺序

    我们通过一段程序来看上面这些接口的调用顺序。

    class IndexHandler(RequestHandler):
    
        def initialize(self):
            print "调用了initialize()"
    
        def prepare(self):
            print "调用了prepare()"
    
        def set_default_headers(self):
            print "调用了set_default_headers()"
    
        def write_error(self, status_code, **kwargs):
            print "调用了write_error()"
    
        def get(self):
            print "调用了get()"
    
        def post(self):
            print "调用了post()"
            self.send_error(200)  # 注意此出抛出了错误
    
        def on_finish(self):
            print "调用了on_finish()"
    
    
    day60_tornado-深入tornado-03.png

    在正常情况未抛出错误时,调用顺序为:

    1. set_defautl_headers()
    2. initialize()
    3. prepare()
    4. HTTP方法
    5. on_finish()

    在有错误抛出时,调用顺序为:

    1. set_default_headers()
    2. initialize()
    3. prepare()
    4. HTTP方法
    5. set_default_headers()
    6. write_error()
    7. on_finish()

    相关文章

      网友评论

        本文标题:(2018-05-26.Python从Zero到One)8、(T

        本文链接:https://www.haomeiwen.com/subject/ljpvjftx.html