5、requests请求之不同参数传递

1、SSL证书验证
requests在请求HTTPS接口时,默认验证SSL证书,请求方法中默认参数为verify=True,如果想要关闭证书验证,可以设置为False,示例如下。

requests.get('https://www.baidu.com', verify=False)

2、不自动重定向
当遇到重定向接口,requests默认跟随重定向,返回所重定向接口的响应对象(),对于一些单点登录后转向的接口,有时我们需要获取原接口响应中的token信息,则需要使用allow_redirects=False关闭自动重定向,使用方法如下。

import requests
res = requests.get('https://httpbin.org/status/302')
print(res) 
res = requests.get('https://httpbin.org/status/302', allow_redirects=False)
print(res)

第一个自动跟随重定向,返回,关闭重定向后返回

3、代理设置
requests支持使用代理,对于HTTP和HTTPS分别使用不同的代理,使用方式如下。

import requests
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)

4、超时设置
requests支持对请求设置超时时间,以防止请求长时间无响应而阻塞,设置方法如下。

import requests
requests.get('https://github.com', timeout=5)  # 设置整体的超时时间5s
requests.get('https://github.com', timeout=(3, 2))  # 分别设置连接和下载响应内容的超时时间3s,2s。

如果在超时时间内未完成响应,则抛出TimeoutError

5、授权设置(身份认证)
授权是请求身份验证的一些开放协议标准,授权协议很多,包括Basic Auth基础授权,Digist Auth摘要授权,Oauth等。
Basic Auth
Basic Auth基础授权使用用户名和密码来验证身份,在requests中使用方法如下。

import requests
requests.get('https://api.github.com/user', auth=('githab账号', '密码'))

OAuth2.0

需要使用requests-oauthlib,参考链接:https://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html

6、会话保持及默认配置
会话Session一般指客户端和服务端的一次连接交互过程。在使用requests.get()等方法时,每次会建立一个新的会话与服务器进行连接。这样不便于保持会话(如登录)状态,如果想要保持会话状态,可以使用同一个会话对象来请求所有接口,示例如下。

import requests
s = requests.Session()  # 新建一个会话对象
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')  # 使用该会话对象请求
r = s.get("http://httpbin.org/cookies")  # 使用同样的会话对象请求
print(r.text)

会话对象还可以用来设置默认的请求头等HTTP配置,示例如下。

s = requests.Session()
s.auth = ('user', 'pass')  # 在会话中设置默认授权
s.headers.update({'x-test': 'true'})  # 在会话中设置默认请求头
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'}) # 默认请求头也会被发送

7、预制请求Preprared-request
假设有多个请求需要先准备好,再逐个发送,可以使用requests.Request()对象的prepare()方法生成预制请求对象,然后使用会话发送即可,示例如下。

import requests
s = request.Session()
req1 = requests.Request('GET', 'https://httpbin.org/get').prepare()
req2 = requests.Request('POST', 'https://httpbin.org/post', data={'a':1}).prepare()
s.send(req1)  # 发送预制请求
s.send(req2, headers={'x-test': 'true'})  # 支持添加额外项

8、使用适配器
适配器用于对匹配到的指定形式的请求做特殊处理,可以直接使用requests.adapters中的HTTPAdapter给定响应参数,也可以继承HTTPAdapter或BaseAdapter自定义处理方式,示例如下

import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=3)  # 设置最大重试3次
s.mount('http://', a)  # 对该会话所有http://开头的请求使用

并发请求
requests本身并不支持异步。想要并发请求常用的有多线程多进程或gevent方式。

多线程
直接使用threading的Thread对象即可,通过target指定要运行的方法,示例如下。

import requests
from threading import Thread

def print_res(res, *args, **kwargs):
    print(res.text)

s = requests.Session()
s.hooks={'response': print_res}

t1 = Thread(target=s.get, args=('https://httpbin.org/get',)) # 指定线程运行方法
t2 = Thread(target=s.post, args=('https://httpbin.org/post',), kwargs={'data': {'a': 1}})
t1.start() # 启动线程
t2.start()
t1.join()  # 连接主线程
t2.join()  

默认线程运行无法获取target函数的运行结果,这里给会话添加了默认hooks方法,来打印响应文本(也可以通过自定义请求方法来实现)。

如果想获取线程结果,需要继承Thread并编写自己的线程处理类,示例如下。

import requests
from threading import Thread

class MyThread(Thread):
    def __init__(self, func, *args, **kwargs):  # 改变线程的使用方式,可以直接传递函数方法和函数参数
        super(MyThread, self).__init__()
        self.func = func
        self.args = args
        self.kwargs = kwargs
        self.result = None

    def run(self):
        self.result = self.func(*self.args, **self.kwargs)  # 为线程添加属性result存储运行结果

t1 = MyThread(requests.get, 'https://httpbin.org/get') 
t2 = MyThread(requests.post, 'https://httpbin.org/post', data={'a':1})
t1.start()
t2.start()
t1.join()
t2.join()
print(t1.result)  # 响应对象
print(t2.result.text)  # 响应对象的text属性即响应文本

使用gevent
安装 pip install gevent
示例如下。

from gevent import monkey;monkey.patch_all()  # 要放import requests上面
import requests
import gevent

g1 = gevent.spawn(requests.get, 'https://httpbin.org/get')
g2 = gevent.spawn(requests.post, 'https://httpbin.org/post', data={'a': 1})

gevent.joinall([g1, g2])

print(g1.value)  # 响应对象
print(g2.value)

使用grequests
安装 pip install grequests
grequests封装了gevent和requests方法,用起来更简单,示例如下。

import grequests

req_list = [
  grequests.get('https://httpbin.org/get', ),  
  grequests.post('https://httpbin.org/post', data={'a': 1})
]
res_list = grequests.map(req_list)
print(res_list)

本章主要讲了一些常用的场景,起始真正项目中很少使用这些参数,但是这是我们出去面试时说出来增加自己能知识广度,吸引面试官的一种方式。

加v一起学习,vx:18547673653 QQ:1270059901

你可能感兴趣的:(5、requests请求之不同参数传递)