Duk*_*gal 5 python python-requests
下面的代码设置_request如果 HTTP 方法是GET,那么它有一个if处理PUT POST和的语句PATCH。
我正在尝试为所有方法类型创建一个请求设置语句。
这可能吗?在我看来,没有办法添加data到准备好的请求中,如果这是真的,那么也许我需要两种不同的方式来设置请求,一种方式用于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)
Run Code Online (Sandbox Code Playgroud)
这个问题有点老了,希望@DukeDougal 已经有了解决方案。不过,也许这会对其他人有所帮助。
我在示例中注意到的第一件事是Request在方法开头附近创建了一个对象。然后,如果方法是“POST”、“PATCH”或“PUT”,则再次Request调用构造函数以获取另一个对象。在这种情况下,第一个对象就消失了。它是不必要地创建的。
当data=没有给Request构造函数提供参数时,它与指定 相同data=None。利用这一点并仅调用构造函数一次,然后data不需要将值添加到现有Request(或PreparedRequest)对象中:
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)
Run Code Online (Sandbox Code Playgroud)
如果您查看requests.Request model,看起来您可以根据data需要设置属性:
some_request = Request(method, url, headers=headers)
if # ...we decide we need to add data:
some_request.data = data
Run Code Online (Sandbox Code Playgroud)
查看模型,这似乎可行,因为当您稍后准备请求data时,它会查看实例的属性。
编辑:
但仔细阅读你的问题,看起来你想将数据添加到prepared_request. 我想您可以创建自己的prepared_request并在调用该prepare方法时专门传递数据,但我不知道这有什么帮助?看起来您只想分支并添加数据或不添加数据?
无论如何,上面的内容似乎可以将您的代码稍微简化为以下内容:
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)
Run Code Online (Sandbox Code Playgroud)
(但这对我来说看起来并不简单。我们想要实现什么?而且,调用一个fetch_from_api也可以POSTing 或PUTing 数据的方法似乎很奇怪。作为一名开发人员,我不会期望这是从名字就可以看出。)
过去,由于必须签署请求,我做过类似的事情:我必须在一个地方创建它们,然后将它们交给一个知道如何创建签名的类,然后由该类将它们交还给我。换句话说,您当然可以在准备和发送请求之前对其进行编辑。
无论如何,我还没有尝试过任何这些,但它与我过去通过请求所做的一些事情类似,所以它看起来合法,但我会担心你试图实现的目标以及事情是否是挤在一起,这也许不应该。