Python requests首次请求返回已存数据时如何在同一会话发起二次请求
答案
完全可以在现有with requests.Session()上下文内发起二次请求,不过你现有代码有个需要修正的小问题:你已经创建了Session实例api,但发请求时调用的是顶级的requests.post(),等于完全没用到Session的连接复用、cookie自动携带等特性,属于不必要的资源浪费。
requests.Session的上下文管理器的作用仅为:在with代码块执行结束后自动关闭会话、释放底层连接资源。只要你的二次请求逻辑仍然写在with块的作用范围内,就可以用同一个Session实例发起任意多次请求,哪怕目标URL、请求方法和第一次完全不同也不受影响。
你可以参考如下调整后的代码逻辑:
import requests from requests.exceptions import HTTPError from rest_framework import status from rest_framework.response import Response with requests.Session() as api: # 第一次请求改用api.post调用,复用Session能力 try: # 直接传json参数会自动帮你做序列化和设置Content-Type,不用手动dumps user = api.post(URL, json=post_obj, headers=headers) user.raise_for_status() except HTTPError as e: return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) # 此处写你存数据库、判断数据是否已存在的逻辑 data_existed = check_data_exists_in_db(user.json()) if data_existed: # 同一会话内直接发起第二次请求即可 try: second_resp = api.post(ANOTHER_URL, json=second_post_obj, headers=headers) second_resp.raise_for_status() except HTTPError as e: return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
额外补充:同一个Session实例发起的多次请求会自动共享cookie、复用TCP连接,相比每次用requests顶级方法发请求能降低请求延迟,也更符合Session的设计初衷。
内容的提问来源于stack exchange,提问作者lr_optim
相关产品推荐
相关产品推荐

