阅读 Tornado 源码过程中的一个疑惑,求解答
时间: 2020-08-21来源:V2EX
前景提要
下面是 tornado.httpclient.AsyncHTTPClient 类的 fetch() 方法的源代码。我没有在里面找到任何"fetch"的动作,它是怎么实现 “ Executes a request, asynchronously returning an HTTPResponse ”的?
完整代码在: https://github.com/tornadoweb/tornado/blob/master/tornado/httpclient.py def fetch ( self , request , callback = None , raise_error = True , ** kwargs ): """Executes a request, asynchronously returning an `HTTPResponse`. The request may be either a string URL or an `HTTPRequest` object. If it is a string, we construct an `HTTPRequest` using any additional kwargs: ``HTTPRequest(request, **kwargs)`` This method returns a `.Future` whose result is an `HTTPResponse`. By default, the ``Future`` will raise an `HTTPError` if the request returned a non-200 response code (other errors may also be raised if the server could not be contacted). Instead, if ``raise_error`` is set to False, the response will always be returned regardless of the response code. If a ``callback`` is given, it will be invoked with the `HTTPResponse`. In the callback interface, `HTTPError` is not automatically raised. Instead, you must check the response's ``error`` attribute or call its `~HTTPResponse.rethrow` method. """ if self . _closed : raise RuntimeError ( "fetch() called on closed AsyncHTTPClient" ) if not isinstance ( request , HTTPRequest ): request = HTTPRequest ( url = request , ** kwargs ) else : if kwargs : raise ValueError ( "kwargs can't be used if request is an HTTPRequest object" ) # We may modify this (to add Host, Accept-Encoding, etc), # so make sure we don't modify the caller's object. This is also # where normal dicts get converted to HTTPHeaders objects. request . headers = httputil . HTTPHeaders ( request . headers ) request = _RequestProxy ( request , self . defaults ) future = TracebackFuture () if callback is not None : callback = stack_context . wrap ( callback ) def handle_future ( future ): exc = future . exception () if isinstance ( exc , HTTPError ) and exc . response is not None : response = exc . response elif exc is not None : response = HTTPResponse ( request , 599 , error = exc , request_time = time . time () - request . start_time ) else : response = future . result () self . io_loop . add_callback ( callback , response ) future . add_done_callback ( handle_future ) def handle_response ( response ): if raise_error and response . error : future . set_exception ( response . error ) else : future . set_result ( response ) self . fetch_impl ( request , handle_response ) return future def fetch_impl ( self , request , callback ): raise NotImplementedError ()

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行