使用Python请求,我可以添加;“数据”;准备好的请求?
下面的代码设置使用Python请求,我可以添加;“数据”;准备好的请求?,python,python-requests,Python,Python Requests,下面的代码设置\u请求如果HTTP方法是GET,那么它有一个if语句来处理PUTPOST和PATCH 我正在尝试为所有方法类型使用一个单独的请求设置语句 这可能吗?在我看来,似乎没有办法向准备好的请求中添加数据,如果这是真的,那么我可能需要两种不同的方法来设置请求,一种是GET,另一种是PUT,PATCH和POST def fetch_from_api(self): s = Session() headers = { "Authorization" : REST_
\u请求
如果HTTP方法是GET
,那么它有一个if
语句来处理PUT
POST
和PATCH
我正在尝试为所有方法类型使用一个单独的请求设置语句
这可能吗?在我看来,似乎没有办法向准备好的请求中添加数据
,如果这是真的,那么我可能需要两种不同的方法来设置请求,一种是GET
,另一种是PUT
,PATCH
和POST
def fetch_from_api(self):
s = Session()
headers = { "Authorization" : REST_API_AUTHORIZATION_HEADER}
_request = Request(self.method, self.url_for_api, headers=headers)
if self.method in ['POST', 'PATCH', 'PUT']:
headers['content-type'] = 'application/x-www-form-urlencoded'
_request = Request(self.method, self.url_for_api, headers=headers, data=self.postdata)
prepped = _request.prepare()
self.api_response = s.send(prepped)
如果查看
requests.Request
,您似乎可以根据需要设置data
属性:
some_request = Request(method, url, headers=headers)
if # ...we decide we need to add data:
some_request.data = data
从模型上看,这似乎是可行的,因为稍后,当您查看实例的数据
属性时
编辑:
但仔细阅读您的问题,您似乎想向准备好的请求添加数据。我想你可以创建自己的准备好的请求
,但我不知道这有什么帮助?似乎您只想分支,也许添加数据,也许不添加
无论如何,上面的内容似乎可以将代码稍微简化为以下内容:
def fetch_from_api(self):
s = Session()
headers = { "Authorization" : REST_API_AUTHORIZATION_HEADER}
_request = Request(self.method, self.url_for_api, headers=headers)
if self.method in ['POST', 'PATCH', 'PUT']:
headers['content-type'] = 'application/x-www-form-urlencoded'
_request.data = self.postdata
prepped = _request.prepare()
self.api_response = s.send(prepped)
(但对我来说,这看起来并不简单。我们想要实现什么?而且,有一个名为fetch\u from\u api
的方法似乎很奇怪,它也可以是POST
ing或PUT
ing数据。作为一个开发人员,我不希望从名称上看到这种情况。)
在过去,由于必须对请求进行签名,我做过这样的事情:我必须在一个地方创建请求,然后将它们交给一个知道如何创建签名的类,然后由该类返回。换句话说,您当然可以在准备和发送请求之前编辑请求
无论如何,我没有尝试过这些,但它与我过去在请求方面所做的一些事情类似,因此它看起来是合法的,但我会关心您试图实现的目标,以及是否有东西被塞满在一起,而这可能是不应该的。我正在使用HTTPforHumans,requests模块
import requests
def pv_request(url, methods, data=None, headers=None, type=None):
try:
if 'POST' in methods:
return requests.post(url=url, headers=headers, data=data).json()
elif 'GET' in methods:
return requests.get(url=url, headers=headers, data=data).json()
elif 'PUT' in methods:
if type == 'music':
return requests.put(url=url, headers=headers, data=data).json()
elif type == 'image':
return requests.put(url=url, headers=headers, data=open(data, 'rb')).json()
except requests.exceptions.ConnectionError:
return None
可能不符合您要查找的内容,但这是我的专用请求处理程序 这个问题有点老了,希望@DukeDougal已经有了解决方案。也许这会帮助其他人
在这个示例中,我注意到的第一件事是在方法的开头附近创建了一个Request
对象。然后,如果方法是“POST”、“PATCH”或“PUT”,则再次调用请求
构造函数,以获取另一个对象。在这种情况下,第一个对象消失了。这是不必要的
当data=
参数未提供给请求
构造函数时,它与指定data=None
相同。利用这一点,只调用构造函数一次,则无需向现有的请求
(或PreparedRequest
)对象添加数据
值:
我试图避免if语句中重复的代码。我只是想使用相同的代码集发送请求,并尝试避免重复。带有请求的GET请求仅在方法中有所不同,即具有“数据”参数。我认为我应该能够使用一行代码来设置请求,并且仅当它不是GET请求时才添加“数据”。好吧,如果您考虑一个实际的HTTP请求,它有头
和体
。它对您的数据一无所知。这就是为什么,当您查找请求的源代码时,您可以在prepare
具有主体但没有数据的之后看到prepared\u请求。就我个人而言,我可能会为GETs编写一个函数,然后再编写另一个函数,因为它对局外人来说更为明显。
def fetch_from_api(self):
s = Session()
headers = {'Authorization': REST_API_AUTHORIZATION_HEADER}
data = None # Assume no data until method is checked
if self.method in ['POST', 'PATCH', 'PUT']:
headers['content-type'] = 'application/x-www-form-urlencoded'
data = self.postdata # Add the data
# Now headers and data are ready, get a Request object
_request = Request(self.method, self.url_for_api, headers=headers, data=data)
prepped = _request.prepare()
self.api_response = s.send(prepped)