web-dev-qa-db-fra.com

En utilisant le module des demandes, comment gérer le «set-cookie» dans la réponse à la demande?

J'essaie d'ouvrir une page de connexion (GET), de récupérer les cookies fournis par le serveur Web, puis de soumettre une paire nom d'utilisateur/mot de passe pour me connecter au site (POST).

En regardant cette question/réponse Stackoverflow , je pense que je ferais simplement ce qui suit:

import requests
import cookielib


URL1 = 'login Prompt page'
URL2 = 'login submission URL'
jar = cookielib.CookieJar()

r = requests.get(URL1, cookies=jar)
r2 = requests.post(URL2, cookies=jar, data="username and password data payload")

Cependant, dans r, il y a set-cookie dans l'en-tête, mais cela ne change pas dans l'objet jar. En fait, rien n'est inséré dans jar comme l'indique la réponse de la question liée.

Je contourne cela dans mon code en ayant un dict d'en-têtes et après avoir fait le GET ou le POST, en utilisant ceci pour gérer le set-cookie entête:

headers['Cookie'] = r.headers['set-cookie']

Passer ensuite l'en-tête dans les méthodes de requêtes. Est-ce correct ou existe-t-il une meilleure façon d'appliquer le set-cookie?

18
tommy_o

Ignorez le cookie-jar, laissez requests gérer les cookies pour vous. Utilisez plutôt un objet session , il conservera les cookies et les renverra au serveur:

with requests.Session() as s:
    r = s.get(URL1)
    r = s.post(URL2, data="username and password data payload")
53
Martijn Pieters

Il y a une classe incluse appelée session qui gère automatiquement ce genre de chose pour vous. Vous pouvez en créer une instance, puis appeler à la place get et set directement sur cette instance.

import requests

URL1 = 'login Prompt page'
URL2 = 'login submission URL'

session = requests.Session()

r = session.get(URL1)
r2 = session.post(URL2, data="username and password data payload")
10
TankorSmash

Une autre méthode qui a fonctionné pour moi (sans utiliser objets de session ) est la suivante (testée dans v2.18.4).

jar = requests.cookies.RequestsCookieJar()
response1 = requests.get(some_url, cookies=jar) # or post ...
jar.update(response1.cookies)
response2 = requests.get(some_other_url, cookies=jar) # or post ...

Notez que le code ci-dessus échouera en présence de redirections qui sont gérées de manière transparente par la bibliothèque Requests . Dans un tel cas, vous devez également mettre à jour votre pot avec les cookies envoyés dans les réponses de redirection. Par exemple. en faisant quelque chose comme ceci:

if (response.history): # we have to add to the cookie jar, the cookies sent by the server in intermediate responses 
    for historicResponse in response.history:
        jar.update(historicResponse.cookies)
2