Python请求从本地URL获取文件 [英] Python requests fetch a file from a local url

查看:2676
本文介绍了Python请求从本地URL获取文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的一种方法中使用Python的请求库应用。该方法的主体如下所示:

  def handle_remote_file(url,** kwargs):
response = requests .get(url,...)
buff = StringIO.StringIO()
buff.write(response.content)
...
返回True

我想为该方法编写一些单元测试,但是,我想做的是传递假的本地url如:

  class RemoteTest(TestCase):
def setUp(self):
self。 url ='file:///tmp/dummy.txt'

def test_handle_remote_file(self):
self.assertTrue(handle_remote_file(self.url))

当我用本地网址调用 requests.get 时,我得到 KeyError 以下例外:

  requests.get('file:///tmp/dummy.txt')

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/packages/urllib3/poolmanager.pyc in connection_from_host(self,host,port,scheme)
76
77#制作所需类型的新ConnectionPool
78 pool_cls = pool_classes_by_scheme [scheme]
79 pool = pool_cls(host ,port,** self.connection_pool_kw)
80

KeyError:'file'

问题是如何将本地网址传递给 requests.get



PS:我编写了以上内容例。它可能包含很多错误。

解决方案

由于@WooParadog解释了请求库不知道如何处理本地文件。虽然,当前版本允许定义传输适配器。 / p>

因此,您可以简单地定义自己的适配器,它将能够处理本地文件,例如:

导入Resp

类LocalFileAdapter(requests.adapters.HTTPAdapter):
def build_response_from_file(self,request):
file_path = request.url [7:]
打开(file_path,'rb')作为文件:
buff = bytearray(os.path.getsize(file_path))
file.readinto(buff)
resp = Resp(buff)
r = self.build_response(request,resp)

return r

def send(self,request,stream = False,timeout =无,
verify = True,cert = None,proxies = None):

返回self.build_response_from_file(请求)

requests_session = requests.session()
requests_session.mount('file://',LocalFileAdapter())
requests_session.get('file://< some_local_path>')

我正在使用 requests-testadapter上例中的模块。


I am using Python's requests library in one method of my application. The body of the method looks like this:

def handle_remote_file(url, **kwargs):
    response = requests.get(url, ...)
    buff = StringIO.StringIO()
    buff.write(response.content)
    ...
    return True

I'd like to write some unit tests for that method, however, what I want to do is to pass a fake local url such as:

class RemoteTest(TestCase):
    def setUp(self):
        self.url = 'file:///tmp/dummy.txt'

    def test_handle_remote_file(self):
        self.assertTrue(handle_remote_file(self.url))

When I call requests.get with a local url, I got the KeyError exception below:

requests.get('file:///tmp/dummy.txt')

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/packages/urllib3/poolmanager.pyc in connection_from_host(self, host, port, scheme)
76 
77         # Make a fresh ConnectionPool of the desired type
78         pool_cls = pool_classes_by_scheme[scheme]
79         pool = pool_cls(host, port, **self.connection_pool_kw)
80 

KeyError: 'file'

The question is how can I pass a local url to requests.get?

PS: I made up the above example. It possibly contains many errors.

解决方案

As @WooParadog explained requests library doesn't know how to handle local files. Although, current version allows to define transport adapters.

Therefore you can simply define you own adapter which will be able to handle local files, e.g.:

from requests_testadapter import Resp

class LocalFileAdapter(requests.adapters.HTTPAdapter):
    def build_response_from_file(self, request):
        file_path = request.url[7:]
        with open(file_path, 'rb') as file:
            buff = bytearray(os.path.getsize(file_path))
            file.readinto(buff)
            resp = Resp(buff)
            r = self.build_response(request, resp)

            return r

    def send(self, request, stream=False, timeout=None,
             verify=True, cert=None, proxies=None):

        return self.build_response_from_file(request)

requests_session = requests.session()
requests_session.mount('file://', LocalFileAdapter())
requests_session.get('file://<some_local_path>')

I'm using requests-testadapter module in the above example.

这篇关于Python请求从本地URL获取文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆