使用 Python 请求,我可以将“数据”添加到准备好的请求中吗?

Duk*_*gal 5 python python-requests

下面的代码设置_request如果 HTTP 方法是GET,那么它有一个if处理PUT POST和的语句PATCH

我正在尝试为所有方法类型创建一个请求设置语句。

这可能吗?在我看来,没有办法添加data到准备好的请求中,如果这是真的,那么也许我需要两种不同的方式来设置请求,一种方式用于GET,一种方式用于PUT,PATCHPOST

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)

L S*_*L S 6

这个问题有点老了,希望@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)


ere*_*wok 2

如果您查看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 数据的方法似乎很奇怪。作为一名开发人员,我不会期望这是从名字就可以看出。)

过去,由于必须签署请求,我做过类似的事情:我必须在一个地方创建它们,然后将它们交给一个知道如何创建签名的类,然后由该类将它们交还给我。换句话说,您当然可以在准备和发送请求之前对其进行编辑。

无论如何,我还没有尝试过任何这些,但它与我过去通过请求所做的一些事情类似,所以它看起来合法,但我会担心你试图实现的目标以及事情是否是挤在一起,这也许不应该。