Files
python3-cookbook/commons/requests/advanced.py
2015-01-06 16:42:50 +08:00

141 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 高级主题
"""
import requests
import re
from io import StringIO
import json
from requests import Request, Session
from contextlib import closing
from requests.auth import AuthBase
from requests.auth import HTTPBasicAuth
def advanced():
# # Session对象
# with requests.Session() as s:
# s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
# r = s.get("http://httpbin.org/cookies")
# print(r.text) # '{"cookies": {"sessioncookie": "123456789"}}'
# s = requests.Session()
# s.auth = ('user', 'pass')
# s.headers.update({'x-test': 'true'})
# # both 'x-test' and 'x-test2' are sent
# s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
# # session中的值可以被方法中的覆盖如果想移除某个参数可以在方法中设置其值为None即可
# # Request和Response对象
# r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
# # 访问服务器返回来的headers
# print(r.headers)
# # 访问我们发送给服务器的headers
# print(r.request.headers)
# # Prepared Requests你想在发送给服务器之前对body或header加工处理的话
# s = Session()
# req = Request('GET', url,
# data=data,
# headers=header
# )
# prepped = s.prepare_request(req)
# # do something with prepped.body
# # do something with prepped.headers
# resp = s.send(prepped,
# stream=stream,
# verify=verify,
# proxies=proxies,
# cert=cert,
# timeout=timeout
# )
# print(resp.status_code)
# # SSL证书认证verify缺省为True
# requests.get('https://kennethreitz.com', verify=True)
# requests.get('https://github.com', verify=True)
# requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))
# # Body内容流
# # 默认情况下当你构造一个request的时候response的body会自动下载可以使用stream延迟下载
# tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
# r = requests.get(tarball_url, stream=True) # 这时候只有响应的headers被下载连接仍然未断开
# if int(r.headers['content-length']) < TOO_LONG:
# content = r.content
# # 接下来还能使用 Response.iter_content and Response.iter_lines来迭代读取数据
# # 或者是urllib3.HTTPResponse at Response.raw.获取为解码的元素字节数据
# # 更好的方法是下面的这样:
# with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
# if int(r.headers['content-length']) < TOO_LONG:
# content = r.content
# # 流式上传模式,上传大文件不需要先将其读到内存中去
# with open('massive-body', 'rb') as f:
# requests.post('http://some.url/streamed', data=f)
# # 多文件POST上传提交
# # <input type=”file” name=”images” multiple=”true” required=”true”/>
# url = 'http://httpbin.org/post'
# multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
# ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
# r = requests.post(url, files=multiple_files)
# print(r.text)
#
# # 自定义认证
# requests.get('http://pizzabin.org/admin', auth=PizzaAuth('kenneth'))
# # 流式请求
# r = requests.get('http://httpbin.org/stream/20', stream=True)
# for line in r.iter_lines():
# # filter out keep-alive new lines
# if line:
# print(json.loads(line.decode('utf-8')))
# # 代理
# proxies = {
# "http": "http://10.10.1.10:3128",
# "https": "http://10.10.1.10:1080",
# }
# 带基本认证的代理
# proxies = {
# "http": "http://user:pass@10.10.1.10:3128/",
# }
# requests.get("http://example.org", proxies=proxies)
# # Github提交示例
# body = json.dumps({"body": "Sounds great! I'll get right on it!"})
# url = "https://api.github.com/repos/kennethreitz/requests/issues/482/comments"
# auth = HTTPBasicAuth('fake@example.com', 'not_a_real_password')
# r = requests.post(url=url, data=body, auth=auth)
# print(r.status_code)
# content = r.json().decode('utf-8')
# print(content['body'])
# # Link Headers
# url = 'https://api.github.com/users/kennethreitz/repos?page=1&per_page=10'
# r = requests.head(url=url)
# print(r.headers['link'])
# print(r.links["next"])
# print(r.links["last"])
# # 超时,第一个是连接服务器的超时时间,第二个是下载超时时间。
# r = requests.get('https://github.com', timeout=(3.05, 27))
pass
class PizzaAuth(AuthBase):
"""Attaches HTTP Pizza Authentication to the given Request object."""
def __init__(self, username):
# setup any auth-related data here
self.username = username
def __call__(self, r):
# modify and return the request
r.headers['X-Pizza'] = self.username
return r
if __name__ == '__main__':
advanced()