2017-10-03 11 views
0

Je soumets des demandes à une API qui peut souvent prendre plusieurs heures pour que mes demandes complètent et renvoient des données. Je travaille sur l'écriture d'une solution python où mon script va soumettre les demandes et écrire les informations d'état dans un fichier sur mon ordinateur portable qui peut être récupéré plus tard si nécessaire.demande python avec cookie de la chaîne de cornichon?

Lorsque je soumets un travail à l'API, l'API répond par une URL d'état qui peut être utilisée pour vérifier l'état de mon travail. Toutefois, en raison de l'équilibrage de la charge du site, j'ai également besoin de récupérer le cookie de session de ma demande initiale et d'utiliser ce cookie pour vérifier que je suis sur le bon serveur lorsque j'utilise l'URL retournée pour vérifier mon statut.

Je suis en mesure de récupérer l'URL d'état de l'API ainsi que le cookie de la demande en utilisant ce code. Notez que je soumets souvent plusieurs emplois, donc il peut y avoir plusieurs cookies URL d'état/dans le fichier:

# Submit the request to the API 
rPOST = requests.post(url, auth=(uname, passwd), data=json_data, headers=headers) 
CookieMonster = pickle.dumps(rPOST.cookies) # Get the cookie as a string 

# Grab the JSON data currently in the file: 
with open(statFile, mode='r') as status_json: 
    StatusDict = json.load(status_json) 
    status_json.close() 
# Add new URL and cookie to the JSON and write back to the file: 
with open(statFile, mode='w') as status_json: 
    StatusDict[(str(json.loads(rPOST.text)[u'link'][u'href']))] = CookieMonster 
    json.dump(StatusDict, status_json) 
    status_json.close() 

Le code fonctionne très bien soumettre, mais je reçois une erreur 404 lorsque vous essayez de vérifier l'état du travail en utilisant la état URL

# Grab the JSON data currently in the file:  
with open(statFile, mode='r') as status_json: 
    StatusDict = json.load(status_json) 
    status_json.close() 

# Check each URL and see if my job's are done: 
for url in StatusDict: 
    CookieMonster = pickle.loads(StatusDict[url]) 
    rGET = requests.get(url, auth=(uname, passwd), cookies=CookieMonster) 

le JSON dans mon fichier d'état ressemble à ceci:

{ 
    "https://example.com/sfsalk242234": "Pickled cookie string data here", 
    "https://example.com/sfsa34532234": "Pickled cookie string data here", 
    "https://example.com/23423fsdfssd": "Pickled cookie string data here" 
} 

cela a quelque chose à voir avec le paramètre = les cookies CookieMonster. Si je supprime le paramètre cookies, et que j'éclate simplement le code plusieurs fois, je finis par équilibrer la charge sur le serveur correct et obtenir une réponse. Cependant, lorsque j'utilise le paramètre cookies, je n'obtiens jamais de réponse et je reçois toujours un message HTTP 404. Notez également que pour les travaux qui durent très longtemps, j'ai souvent besoin de déconnecter mon ordinateur portable, de le mettre en veille, de le redémarrer, etc ... donc garder le script en cours pour préserver l'objet cookie d'origine n'est pas vraiment une option viable , c'est pourquoi j'écris l'URL de statut et les données de cookie sur le disque.

Comment puis-je stocker correctement un cookie comme celui-ci, puis le récupérer pour une future demande?

Mise à jour Solution

rPOST = requests.post(url, auth=(uname, passwd), data=json_data, headers=headers) 
CookieMonster = rPOST.cookies 
with open(statFile, mode='w') as status_json: 
    StatusDict[(str(json.loads(rPOST.text)[u'link'][u'href']))] = CookieMonster.items() 
    json.dump(StatusDict, status_json) 

changer ensuite la récupération pour ressembler à ceci:

# Check each URL and see if my job's are done: 
for url, cookies in StatusDict: 
    rGET = requests.get(url, auth=(uname, passwd), cookies=dict(cookies)) 

Répondre

0

Je voudrais éviter l'utilisation cornichon comme RequestsCookieJar est un peu d'une enveloppe autour d'un dictionnaire, et les demandes les méthodes prennent des dictionnaires en entrée pour les cookies.

with open(statFile, mode='w') as status_json: 
    StatusDict[(str(json.loads(rPOST.text)[u'link'][u'href']))] = CookieMonster.items() 
    json.dump(StatusDict, status_json) 

Puis, plus tard

# Check each URL and see if my job's are done: 
for url, cookies in StatusDict: 
    rGET = requests.get(url, auth=(uname, passwd), cookies=dict(cookies)) 
+0

Merci! La seule chose que j'ajouterais à votre code est que CookieMonster = pickle.dumps (rPOST.cookies) doit être changé en CookieMonster = rPOST.cookies pour fonctionner. Avec cette mise à jour, cela a fonctionné comme un charme! – user3246693