requests.post()  方法的使用

本文详细介绍了Python中requests库的post()方法使用,包括如何发送带数据、带header、带json、带参数的POST请求,以及如何上传普通文件、定制化文件和多文件,最后讲解了流式上传的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

requests.post()  方法的使用:

文目录:

一、方法定义

二、post方法简单使用

  1、带数据的post

  2、带header的post

  3、带json的post

  4、带参数的post

  5、普通文件上传

  6、定制化文件上传

  7、多文件上传

 

一、方法定义:

1、到官方文档去了下requests.post()方法的定义,如下:

 

2、源码:

 

3、常用返回信息:

 

二、post方法简单使用:

 1、带数据的post:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"
url = ''.join([host,endpoint])
data = {'key1':'value1','key2':'value2'}

r = requests.post(url,data=data)
#response = r.json()
print (r.text)

复制代码

输出:

复制代码

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.1"
  }, 
  "json": null, 
  "origin": "183.14.133.88", 
  "url": "http://httpbin.org/post"
}

复制代码

 

2、带header的post:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"

url = ''.join([host,endpoint])
headers = {"User-Agent":"test request headers"}

# r = requests.post(url)
r = requests.post(url,headers=headers)
#response = r.json()

复制代码

输出:

复制代码

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "0", 
    "Host": "httpbin.org", 
    "User-Agent": "test request headers"
  }, 
  "json": null, 
  "origin": "183.14.133.88", 
  "url": "http://httpbin.org/post"
}

复制代码

 

3、带json的post:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"

url = ''.join([host,endpoint])
data = {
    "sites": [
                { "name":"test" , "url":"www.test.com" },
                { "name":"google" , "url":"www.google.com" },
                { "name":"weibo" , "url":"www.weibo.com" }
    ]
}

r = requests.post(url,json=data)
# r = requests.post(url,data=json.dumps(data))
response = r.json()

复制代码

输出:

复制代码

{
  "args": {}, 
  "data": "{\"sites\": [{\"url\": \"www.test.com\", \"name\": \"test\"}, {\"url\": \"www.google.com\", \"name\": \"google\"}, {\"url\": \"www.weibo.com\", \"name\": \"weibo\"}]}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "140", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.1"
  }, 
  "json": {
    "sites": [
      {
        "name": "test", 
        "url": "www.test.com"
      }, 
      {
        "name": "google", 
        "url": "www.google.com"
      }, 
      {
        "name": "weibo", 
        "url": "www.weibo.com"
      }
    ]
  }, 
  "origin": "183.14.133.88", 
  "url": "http://httpbin.org/post"
}

复制代码

 

4、带参数的post:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"

url = ''.join([host,endpoint])
params = {'key1':'params1','key2':'params2'}

# r = requests.post(url)
r = requests.post(url,params=params)
#response = r.json()
print (r.text)

复制代码

输出:

复制代码

{
  "args": {
    "key1": "params1", 
    "key2": "params2"
  }, 
  "data": "", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "0", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.1"
  }, 
  "json": null, 
  "origin": "183.14.133.88", 
  "url": "http://httpbin.org/post?key2=params2&key1=params1"
}

复制代码

 

5、普通文件上传:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"

url = ''.join([host,endpoint])
#普通上传
files = {
            'file':open('test.txt','rb')
        }

r = requests.post(url,files=files)
print (r.text)

复制代码

输出:

复制代码

{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "hello world!\n"
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "157", 
    "Content-Type": "multipart/form-data; boundary=392865f79bf6431f8a53c9d56c62571e", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.1"
  }, 
  "json": null, 
  "origin": "183.14.133.88", 
  "url": "http://httpbin.org/post"
}

复制代码

 

6、定制化文件上传:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"

url = ''.join([host,endpoint])
#自定义文件名,文件类型、请求头
files = {
        'file':('test.png',open('test.png','rb'),'image/png')
}

r = requests.post(url,files=files)
print (r.text)heman793

复制代码

输出比较在,就不帖了。

 

7、多文件上传:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"

url = ''.join([host,endpoint])
#多文件上传
files = [
    ('file1',('test.txt',open('test.txt', 'rb'))),
    ('file2', ('test.png', open('test.png', 'rb')))
    ]

r = requests.post(url,files=files)
print (r.text)

复制代码

输出上,太多内容,不帖了。

 

8、流式上传:

复制代码

# -*- coding:utf-8 -*-
import requests
import json

host = "http://httpbin.org/"
endpoint = "post"

url = ''.join([host,endpoint])

#流式上传
with open( 'test.txt' ) as f:
    r = requests.post(url,data = f)

print (r.text)

复制代码

输出:

复制代码

{
  "args": {}, 
  "data": "hello world!\n", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "13", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.1"
  }, 
  "json": null, 
  "origin": "183.14.133.88", 
  "url": "http://httpbin.org/post"
}

复制代码

<think>好的,用户让我帮忙修改他们的Python代码,使得通过Ollama API获得的回复只保留正文部分。首先,我需要仔细看一下他们提供的代码。 用户当前的代码使用requests库发送POST请求到本地的Ollama API,模型是deepseek-r1:8b,然后从返回的JSON中提取'message'字段,并将其添加到message_list中。最后,他们打印出整个res_msg_dict的字符串形式,但发现回复中包含了多余的信息,比如role和可能的其他字段,而他们只需要正文内容。 首先,我需要确认API返回的数据结构。根据Ollama的文档,当使用/api/chat端点并且stream设置为False时,返回的JSON中应该有一个'message'字段,这个字段本身是一个包含'role'和'content'的字典。例如: ```json { "message": { "role": "assistant", "content": "这是回复内容" } } ``` 所以,用户代码中的data_dict['message']应该是一个字典,包含'role'和'content'两个键。因此,要获取正文部分,应该访问data_dict['message']['content'],而不是整个message字典。 用户当前的代码将整个res_msg_dict(即data_dict['message'])添加到message_list中,这可能没问题,因为Ollama的API在后续请求中可能需要完整的messages历史,包括role和content。但用户的问题在于打印的时候,他们希望只输出content部分。 所以,修改点应该是在处理返回数据时,提取content字段。具体来说,将原来的: ```python res_msg_dict = data_dict['message'] back = str(res_msg_dict) ``` 改为: ```python res_content = data_dict['message']['content'] back = res_content ``` 同时,在将助手的回复添加到message_list时,应该确保结构正确,即每个消息都是一个包含role和content的字典。因此,用户可能需要将res_msg_dict(即data_dict['message'])整个添加到message_list中,而不仅仅是content部分,否则后续的API调用可能会因为结构不正确而失败。但用户的需求是只保留正文部分,所以需要确认是否需要调整message_list的存储方式。 不过,根据Ollama的API文档,/api/chat端点要求messages参数中的每个消息都有role和content。因此,在message_list中,必须保留role和content的结构。用户当前的代码是正确的,因为res_msg_dict已经包含了role和content,所以添加到message_list中是合适的。问题出在打印时,用户希望只显示content部分,而不是整个字典。因此,正确的做法是在打印时提取content,而不是修改message_list的存储。 所以,修改后的代码应该将back变量设置为res_msg_dict['content'],而不是整个字典的字符串形式。同时,确保message_list仍然添加完整的res_msg_dict(包含role和content),以维持对话历史的结构正确。 另外,用户可能需要处理可能的错误,比如API返回的数据中没有'message'字段,或者'message'中没有'content'。可以添加异常处理来避免程序崩溃,例如使用try-except块,或者在访问字典时使用get方法提供默认值。 总结修改步骤: 1. 从data_dict['message']中提取'content'字段。 2. 将back变量设置为该content字段的值。 3. 确保message_list仍然添加完整的res_msg_dict,以保持API请求的结构正确。 4. 添加错误处理,防止键不存在的情况。 可能的代码修改部分如下: 原代码: ```python res_msg_dict = data_dict['message'] message_list.append(res_msg_dict) back = str(res_msg_dict) ``` 修改为: ```python res_msg_dict = data_dict['message'] message_list.append(res_msg_dict) # 保持原有结构 back = res_msg_dict.get('content', '') # 提取content,如果不存在则返回空字符串 print(back) ``` 这样,back变量就只包含回复的正文内容,而message_list仍然保留了完整的消息结构,符合API的要求。 此外,用户可能希望处理返回内容中的转义字符或其他格式问题,例如去除首尾空格或换行符。可以在back变量处理时添加strip()方法: ```python back = res_msg_dict.get('content', '').strip() ``` 另外,检查用户是否在代码中正确处理了HTTP错误,比如检查res.status_code是否为200,否则可能出现解析错误。例如: ```python res = requests.post(...) if res.status_code != 200: print("请求失败,状态码:", res.status_code) continue data_dict = res.json() ``` 这可以增强代码的健壮性。 最后,用户可能需要考虑流式输出的情况,但当前代码中stream参数设置为False,所以暂时不需要处理流式数据。但如果有需要,可以调整代码以支持流式响应,但根据用户当前的需求,这似乎不需要。 综上所述,主要修改点在于正确提取content字段,并确保对话历史的结构正确,同时添加必要的错误处理以提高代码的稳定性。</think>以下是改进后的代码实现及关键修改说明: --- ### 改进方案(保留对话结构,精准提取内容) ```python import requests message_list = [] while True: text = input("请输入:") if text.lower() in ['exit', 'quit']: break # 添加用户消息 message_list.append({"role": "user", "content": text}) try: res = requests.post( url="http://localhost:11434/api/chat", json={ "model": "deepseek-r1:8b", "messages": message_list, "stream": False }, timeout=60 ) res.raise_for_status() # 检查HTTP错误 data_dict = res.json() assistant_response = data_dict['message']['content'] # 关键修改点 # 添加助手回复到历史 message_list.append({ "role": "assistant", "content": assistant_response }) print("助手回复:", assistant_response.strip()) # 清理首尾空格 except Exception as e: print(f"请求出错:{str(e)}") continue ``` --- ### 核心修改说明 #### 1. 精准内容提取 ```python # 原代码: back = str(data_dict['message']) # 修改后: assistant_response = data_dict['message']['content'] ``` * 直接从响应字典中提取`content`字段 #### 2. 数据清理增强 ```python .strip() # 移除首尾空白字符 ``` #### 3. 异常处理强化 ```python res.raise_for_status() # 自动触发HTTP错误 try-except块包裹整个请求流程 ``` #### 4. 退出机制优化 ```python if text.lower() in ['exit', 'quit']: break ``` --- ### 高级优化建议 #### 1. 内容过滤(可选) ```python # 添加正则过滤特殊字符 clean_response = re.sub(r'[\x00-\x1F]+', '', assistant_response) ``` #### 2. 上下文长度控制 ```python # 在循环开始前定义 MAX_HISTORY = 5 # 保留最近5轮对话 # 每次添加消息后检查 if len(message_list) > MAX_HISTORY * 2: message_list = message_list[-MAX_HISTORY*2:] ``` #### 3. 格式化输出 ```python # 使用textwrap进行自动换行 import textwrap print(textwrap.fill(assistant_response, width=80)) ``` --- ### 修改后代码特点 1. **精准提取**:直接获取`message.content`字段内容 2. **数据安全**: - 严格校验HTTP状态码 - 异常捕获覆盖整个请求流程 3. **可维护性**: - 明确的上下文长度限制 - 易扩展的内容过滤机制 4. **用户体验**: - 友好的退出指令 - 自动清理响应内容格式 建议同时监控API返回数据的结构,可通过临时添加`print(json.dumps(data_dict, indent=2))`查看完整响应格式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值