如何使用requests发送带有头部信息的PATCH请求

24

我有一个使用基于令牌的身份验证进行API的Rails 4应用程序,需要能够通过Python 3脚本更新记录。

我的当前脚本如下所示

import requests
import json

url = 'http://0.0.0.0:3000/api/v1/update_experiment.json'
payload = {'expt_name' : 'A60E001', 'status' : 'done' }

r = requests.patch(url, payload)

如果我禁用API身份验证,它可以正常工作。

我无法弄清楚如何添加标头,根据文档,requests.patch只需要两个参数。

我需要达到下面添加头信息的点:

'Authorization:Token token="xxxxxxxxxxxxxxxxxxxxxx"'

这种类型的标头在curl中可以正常工作。我如何在Python 3和requests中实现这一点?


你有实际尝试添加 headers= 吗?发生了什么事情? - jonrsharpe
我尝试了类似于 headers= {'Authorization': 'Token', 'token': 'xxxxxx' } 然后 r = requests.patch(url, payload, headers=headers) 但是没有任何反应,Python 没有错误,Rails 的 WebRick 也没有反应。尝试通过日志来查看发生了什么。 - Bart C
1个回答

25

patch 有kwargs参数,只需传递headers = {your_header}即可:

def patch(url, data=None, **kwargs):
    """Sends a PATCH request.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    return request('patch', url,  data=data, **kwargs)

所以类似这样:

head = {"Authorization":"Token token=xxxxxxxxxxxxxxxxxxxxxx"}
url = 'http://0.0.0.0:3000/api/v1/update_experiment.json'
payload = {'expt_name' : 'A60E001', 'status' : 'done' }

r = requests.patch(url, payload, headers=head)

1
嗨。我尝试使用headers = {'Authorization': 'Token','token': 'xxxxxx'},然后使用r = requests.patch(url, payload, headers=headers),但Rails似乎不喜欢这样做。身份验证失败。我该如何查看Python实际发送了什么,如何检查标头。我尝试了print(r.headers),但这并不包括我传递的任何标头信息。 - Bart C
@BartC 注意,那不是标题的格式 - 请重新阅读最后一个代码片段。 - jonrsharpe
1
@PadraicCunningham 非常感谢!!!这很有效,我错过了那个细节/一直没有理解它,这是导致我在许多其他尝试中使其工作的罪魁祸首。再次感谢。 - Bart C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接