Python demandes de récupérer un fichier à partir d'une url locale
Je suis à l'aide de Python les demandes bibliothèque dans une méthode de ma demande. Le corps de la méthode ressemble à ceci:
def handle_remote_file(url, **kwargs):
response = requests.get(url, ...)
buff = StringIO.StringIO()
buff.write(response.content)
...
return True
J'aimerais écrire des tests unitaires pour cette méthode, cependant, ce que je veux faire est de faire passer un faux local url de la forme:
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))
Quand je l'appelle demandes.obtenir avec une url locale, j'ai eu l' KeyError l'exception ci-dessous:
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'
La question est de savoir comment puis-je passer une url locale à demandes.obtenir?
PS: j'ai pris l'exemple ci-dessus. Il est possible qu'il contient de nombreuses erreurs.
- Pouvez-vous utiliser pur local python serveur web?
Vous devez vous connecter pour publier un commentaire.
Comme @WooParadog expliqué demandes bibliothèque ne sais pas comment gérer les fichiers locaux. Bien que, de la version actuelle permet de définir le transport des adaptateurs.
Par conséquent, vous pouvez simplement définir vous propre adaptateur qui sera capable de gérer des fichiers locaux, par exemple:
Je suis en utilisant demandes-testadapter module dans l'exemple ci-dessus.
Voici un adaptateur de transport que j'ai écrit qui est plus plein de fonctionnalités que b1r3k et n'a pas de dépendances supplémentaires au-delà des Demandes d'elle-même. Je n'ai pas testé de manière exhaustive, mais de ce que j'ai essayé semble être exempt de bogues.
(Malgré le nom, il a été entièrement écrit avant que je pense à vérifier Google, de sorte qu'il n'a rien à voir avec b1r3k de l'.) Comme avec les autres répondre, suivez ce avec:
../foo.bar
. Cependant, il a été simple de changer la méthode d'envoi afin de ne pas utiliserreq.path_url()
mais utilise à la place de quelque chose qui enlève lefile://
et conserve le reste.urlparse.urljoin
(Python 2) ouurllib.parse.urljoin
(Python 3).)packages/urllib3/poolmanager.py assez bien explique. Les demandes ne prend pas en charge locale de l'url.
Dans un projet récent, j'ai eu le même problème. Car les demandes ne prend pas en charge les fichiers "régime", je vais patch notre code pour charger le contenu local. Tout d'abord, de définir une fonction pour remplacer
requests.get
:Puis, quelque part dans l'installation d'essai ou la décoration de la fonction de test, j'utilise
mock.patch
de patch la fonction obtenir sur demande:Cette technique est un peu fragile, il ne faut pas les aider si le code sous-jacent appels
requests.request
ou construit unSession
et les appels. Il y a peut être un moyen de demandes de correctifs à un niveau inférieur à l'appui defile:
Url, mais dans mon enquête initiale, il ne semble pas être évident de point de crochet, je suis donc allé avec cette approche plus simple.