From d79ba85ac2b40d8ddeab680fd5dcc2c54a0410cf Mon Sep 17 00:00:00 2001 From: zy Date: Thu, 29 Jun 2017 14:52:10 +0800 Subject: [PATCH 1/3] Add highlight. Add highlight. --- doc/Requests_v0.3.0.md | 50 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/doc/Requests_v0.3.0.md b/doc/Requests_v0.3.0.md index 42a0a46..53b7451 100644 --- a/doc/Requests_v0.3.0.md +++ b/doc/Requests_v0.3.0.md @@ -154,7 +154,7 @@ 测试终于加了关于post的测试。 -``` +```python def test_POSTBIN_GET_POST_FILES(self): bin = requests.post('http://www.postbin.org/') @@ -198,7 +198,7 @@ StringIO 是一个可以把 String 强制转换成 类似于 FILE 类的东西 也就是说,在post和put方法里面加入files 参数来支持,可以是StirngIO类型,也可以是File类型(maybe),上源码细节。 -``` +```python elif self.method == 'POST': if (not self.sent) or anyway: @@ -225,7 +225,7 @@ StringIO 是一个可以把 String 强制转换成 类似于 FILE 类的东西 好,转战 multipart_encode。当post 一个文件的时候,数据要以MIME 格式分块,客户端生成随机的 boundry来标记一块的开头和结尾,并且需要在 header中加入 Content-Length 来表明文件大小。所以这个函数大致是干这些事情。我把注释写在后面。 -``` +```python def multipart_encode(params, boundary=None, cb=None): if boundary is None: boundary = gen_boundary() # 生成随机字符串作为 boundary @@ -257,7 +257,7 @@ def multipart_encode(params, boundary=None, cb=None): v0.2.1 -``` +```python try: opener = self._get_opener() resp = opener(req) @@ -278,7 +278,7 @@ v0.2.1 v0.2.2 -``` +```python try: resp = opener(req) self._build_response(resp) @@ -294,7 +294,7 @@ v0.2.2 在 core 代码最顶部加了如下部分。 -``` +```python try: import eventlet eventlet.monkey_patch() @@ -325,12 +325,12 @@ if not 'eventlet' in locals(): 同样以get 举例 -``` +```python r.cookiejar = cookies ``` 加入了cookies 参数 -``` +```python if self.cookiejar: cookie_handler = urllib2.HTTPCookieProcessor(cookiejar) @@ -359,7 +359,7 @@ if self.cookiejar: 改进了类 Response 的表现形式。来看一下对新的 Response 类的新加的测试内容,第一个测试。 -``` +```python def test_nonzero_evaluation(self): r = requests.get('http://google.com/some-404-url') self.assertEqual(bool(r), False) @@ -370,7 +370,7 @@ if self.cookiejar: 对返回的 Response 类进行 bool 运算,相关实现代码如下。 -``` +```python def __nonzero__(self): """Returns true if status_code is 'OK'.""" return not self.error @@ -381,7 +381,7 @@ if self.cookiejar: 当调用opener(resq)的时候,出现异常,会更改self.error 变量。 -``` +```python try: resp = opener(req) self._build_response(resp) @@ -395,7 +395,7 @@ except urllib2.HTTPError as why: 第二个测试。 -``` +```python def test_request_ok_set(self): r = requests.get('http://google.com/some-404-url') self.assertEqual(r.ok, False) @@ -405,7 +405,7 @@ def test_request_ok_set(self): 第三个测试 -``` +```python def test_status_raising(self): r = requests.get('http://google.com/some-404-url') self.assertRaises(requests.HTTPError, r.raise_for_status) @@ -417,7 +417,7 @@ def test_status_raising(self): ``` 相应代码: -``` +```python def raise_for_status(self): """Raises stored HTTPError if one exists.""" if self.error: @@ -447,7 +447,7 @@ def test_status_raising(self): ** 3. 自动验证测试 ** 这个版本最主要的改动,就是优化了测试文件。把测试文件改成了继承 TestSite的类(话说这不是常识吗...) -``` +```python class RequestsTestSuite(unittest.TestCase): """Requests test cases.""" @@ -470,7 +470,7 @@ class RequestsTestSuite(unittest.TestCase): 哈哈哈,我上一遍质疑他的东西,果然在五天后就改过来了~ -``` +```python class Request(object): """The :class:`Request` object. It carries out all functionality of Requests. Recommended interface is with the Requests functions. @@ -521,7 +521,7 @@ class Request(object): 之前 -``` +```python def test_AUTH_HTTPS_200_OK_GET(self): auth = requests.AuthObject('requeststest', 'requeststest') url = 'https://convore.com/api/account/verify.json' @@ -541,7 +541,7 @@ class Request(object): 现在 -``` +```python def test_AUTH_HTTPS_200_OK_GET(self): auth = ('requeststest', 'requeststest') url = 'https://convore.com/api/account/verify.json' @@ -570,7 +570,7 @@ class Request(object): 关于这一点更新,体现在这个测试中 -``` +```python def test_HTTP_200_OK_GET_WITH_MIXED_PARAMS(self): heads = {'User-agent': 'Mozilla/5.0'} r = requests.get('http://google.com/search?test=true', params={'q': 'test'}, headers=heads) @@ -581,13 +581,13 @@ class Request(object): send中 -``` +```python if self.method in ('GET', 'HEAD', 'DELETE'): req = _Request(self._build_url(self.url, self._enc_data), method=self.method) ``` self._build_url() -``` +```python @staticmethod def _build_url(url, data): """Build URLs.""" @@ -608,7 +608,7 @@ self._build_url() 这一点更新,跟上一点差不多。代码如下。 -``` +```python if self.files: register_openers() if self.data: @@ -626,7 +626,7 @@ if self.files: 首先是Request 初始化时,关于Auth 的细节。 -``` +```python class Reuqest(object): def __init__(self): @@ -650,7 +650,7 @@ auth_manager 是一个全局的 AuthManager() 对象。 代码如下 -``` +```python class AuthManager(object): """Authentication Manager.""" @@ -674,7 +674,7 @@ class AuthManager(object): 基本在这个函数中,可窥一斑。 -``` +```python def reduce_uri(self, uri, default_port=True): """Accept authority or URI and extract only the authority and path.""" # note HTTP URLs do not have a userinfo component From ea74306bca254228f1214ecde22aad740c94f5cc Mon Sep 17 00:00:00 2001 From: Ying Zou Date: Mon, 11 Sep 2017 13:21:47 +0800 Subject: [PATCH 2/3] =?UTF-8?q?requests:=20Requests=5Fv0.2.0=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=AF=AD=E6=B3=95=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Requests_v0.2.0.md | 134 ++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/doc/Requests_v0.2.0.md b/doc/Requests_v0.2.0.md index a8993cd..6165e11 100644 --- a/doc/Requests_v0.2.0.md +++ b/doc/Requests_v0.2.0.md @@ -64,7 +64,7 @@ Most existing Python modules for dealing HTTP requests are insane. I have to loo But this one's different. This one's going to be awesome. And simple. -Really simple. +Really simple. ``` @@ -140,7 +140,7 @@ API 部分,安装部分,就直接跳过吧。 requests 代码之前,先从测试代码开始吧。 -``` +```python class RequestsTestSuite(unittest.TestCase): """Requests test cases.""" @@ -183,24 +183,24 @@ class RequestsTestSuite(unittest.TestCase): self.assertRaises 这个用法我没用过,去翻了一个标准库文档,文档里面有这样一个例子,还是很好玩的: +```python +def test_split(self): + # check that s.split fails when the separator is not a string + with self.assertRaises(TypeError): + s.split(2) ``` - def test_split(self): - # check that s.split fails when the separator is not a string - with self.assertRaises(TypeError): - s.split(2) -``` 函数定义: -assertRaises(exc, fun, *args, **kwds) +`assertRaises(exc, fun, *args, **kwds)` ### 0x05 -终于开始撸代码了,requests 包只包含一个__init__.py 和 core.py, core.py 405行。 +终于开始撸代码了,requests 包只包含一个`__init__.py` 和 `core.py`, `core.py` 405行。 -当使用 requests.get('www.baidu.com')时,直接到requests 包定义的相应函数,以 get 举例。 +当使用 `requests.get('www.baidu.com')`时,直接到requests 包定义的相应函数,以 get 举例。 -``` +```python def get(url, params={}, headers={}, auth=None): """Sends a GET request. Returns :class:`Response` object. @@ -225,7 +225,7 @@ def get(url, params={}, headers={}, auth=None): ``` 先会实例化一个 Request, Request 类定义在47行。 -``` +```python class Request(object): """The :class:`Request` object. It carries out all functionality of Requests. Recommended interface is with the Requests functions. @@ -257,7 +257,7 @@ class Request(object): 在 `__setattr__` 对method做了限制。 -``` +```python def __setattr__(self, name, value): if (name == 'method') and (value): if not value in self._METHODS: @@ -269,7 +269,7 @@ class Request(object): 这也是一个好玩的用法,我比较水啦,如果是我,我会直接在类初始化的时候搞定这些... 就像下面这样。 -``` +```python class Request(object): """The :class:`Request` object. writtern by Lionel Wang """ @@ -292,7 +292,7 @@ class Request(object): 有没有高人跟我说下这样的好处? -``` +```python r,auth = _detect_auth(url, auth) ``` @@ -302,52 +302,52 @@ r,auth = _detect_auth(url, auth) 在Requests.send() 里面,对 method 的不同,做了不一样的处理,我们只看get。 -``` +```python def send(self, anyway=False): - """Sends the request. Returns True of successfull, false if not. - If there was an HTTPError during transmission, - self.response.status_code will contain the HTTPError code. + """Sends the request. Returns True of successfull, false if not. + If there was an HTTPError during transmission, + self.response.status_code will contain the HTTPError code. - Once a request is successfully sent, `sent` will equal True. - - :param anyway: If True, request will be sent, even if it has - already been sent. - """ - self._checks() + Once a request is successfully sent, `sent` will equal True. + + :param anyway: If True, request will be sent, even if it has + already been sent. + """ + self._checks() - success = False - - if self.method in ('GET', 'HEAD', 'DELETE'): - if (not self.sent) or anyway: + success = False + + if self.method in ('GET', 'HEAD', 'DELETE'): + if (not self.sent) or anyway: - # url encode GET params if it's a dict - if isinstance(self.params, dict): - params = urllib.urlencode(self.params) - else: + # url encode GET params if it's a dict + if isinstance(self.params, dict): + params = urllib.urlencode(self.params) + else: - params = self.params + params = self.params - req = _Request(("%s?%s" % (self.url, params)), method=self.method) + req = _Request(("%s?%s" % (self.url, params)), method=self.method) - if self.headers: - req.headers = self.headers + if self.headers: + req.headers = self.headers - opener = self._get_opener() + opener = self._get_opener() - try: - resp = opener(req) - self.response.status_code = resp.code - self.response.headers = resp.info().dict - if self.method.lower() == 'get': - self.response.content = resp.read() + try: + resp = opener(req) + self.response.status_code = resp.code + self.response.headers = resp.info().dict + if self.method.lower() == 'get': + self.response.content = resp.read() - success = True - except urllib2.HTTPError, why: - self.response.status_code = why.code - - self.sent = True if success else False - - return success + success = True + except urllib2.HTTPError, why: + self.response.status_code = why.code + + self.sent = True if success else False + + return success ``` self._checks() 是封装了url是否非None 的函数。pass @@ -355,25 +355,23 @@ self._checks() 是封装了url是否非None 的函数。pass 正如作者所说,这个版本封装了urllib, urllib2 的方法,像我这种被reqeusts 宠坏了的人,为了拆他,滚去翻urllib2的文档了 (; ̄ェ ̄) -``` - if isinstance(self.params, dict): - params = urllib.urlencode(self.params) - else: +```python + if isinstance(self.params, dict): + params = urllib.urlencode(self.params) + else: - params = self.params + params = self.params - req = _Request(("%s?%s" % (self.url, params)), method=self.method) + req = _Request(("%s?%s" % (self.url, params)), method=self.method) ``` -如果传过来parms 形如 +如果传过来parms形如 -``` +```python parms ={'age':23, 'name':wsp}, url='www.baidu.com' - - ``` -将他转换成 www.baidu.com?age=23&name=wsp +将他转换成`www.baidu.com?age=23&name=wsp` urllib.urlencode(query, [,doseq]) @@ -384,7 +382,7 @@ urllib.urlencode(query, [,doseq]) _Request 是继承了 urllib2.Requsts 的类。 代码如下 -``` +```python class _Request(urllib2.Request): """Hidden wrapper around the urllib2.Request object. Allows for manual setting of HTTP methods. @@ -410,15 +408,15 @@ class _Request(urllib2.Request): 最后组装返回的类,没什么好说的了 -``` - self.response.status_code = resp.code - self.response.headers = resp.info().dict - self.response.content = resp.read() +```python +self.response.status_code = resp.code +self.response.headers = resp.info().dict +self.response.content = resp.read() ``` 不过try except 写的很好玩。 -``` +```python except urllib2.HTTPError, why: self.response.status_code = why.code ``` From 518586ee7e293b9442f8a999a7258f3d72aa8c5a Mon Sep 17 00:00:00 2001 From: Ying Zou Date: Mon, 11 Sep 2017 13:27:38 +0800 Subject: [PATCH 3/3] requests: more format. --- doc/Requests_v0.2.0.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/doc/Requests_v0.2.0.md b/doc/Requests_v0.2.0.md index 6165e11..76b0399 100644 --- a/doc/Requests_v0.2.0.md +++ b/doc/Requests_v0.2.0.md @@ -258,12 +258,12 @@ class Request(object): 在 `__setattr__` 对method做了限制。 ```python - def __setattr__(self, name, value): - if (name == 'method') and (value): - if not value in self._METHODS: - raise InvalidMethod() - - object.__setattr__(self, name, value) +def __setattr__(self, name, value): + if (name == 'method') and (value): + if not value in self._METHODS: + raise InvalidMethod() + + object.__setattr__(self, name, value) ``` 这也是一个好玩的用法,我比较水啦,如果是我,我会直接在类初始化的时候搞定这些... @@ -356,13 +356,12 @@ self._checks() 是封装了url是否非None 的函数。pass 正如作者所说,这个版本封装了urllib, urllib2 的方法,像我这种被reqeusts 宠坏了的人,为了拆他,滚去翻urllib2的文档了 (; ̄ェ ̄) ```python - if isinstance(self.params, dict): - params = urllib.urlencode(self.params) - else: - - params = self.params +if isinstance(self.params, dict): + params = urllib.urlencode(self.params) +else: + params = self.params - req = _Request(("%s?%s" % (self.url, params)), method=self.method) +req = _Request(("%s?%s" % (self.url, params)), method=self.method) ``` 如果传过来parms形如