2017-08-08 4 views
0

Je suis en train de développer un outil web et j'ai quelques problèmes avec le paramétrage des cookies. J'avais l'habitude de le faire en Perl il y a 20 ans et je suis choqué qu'il ne semble pas y avoir une façon claire et nette de gérer les cookies avec Python en 2017! Ce que je pensais être facile et rapide a pris toute la journée. J'ai expérimenté le paramétrage manuel des cookies, en utilisant le module de requêtes, et une multitude d'exemples de code partiel que j'ai trouvés sur Stack Overflow. Partout où je regarde, la documentation est pauvre, il n'y a pas d'exemples de travail complets, ou les réponses sont anciennes.Problèmes de configuration des cookies de navigateur dans Python cgi

Je crée un script cgi avec Python. Sur la page de connexion du script, j'ai print "Content-type: text/html\r\n" afin d'avoir une zone de texte et un menu de sélection apparaissent sur la page Web. Lorsque l'utilisateur clique sur Envoyer, j'ai une étape de validation qui doit imprimer quelque chose sur la page s'il y a une erreur. S'il n'y a pas d'erreurs, j'ai besoin du script pour charger une nouvelle page et définir un cookie.

Voici le code que je utilise pour définir mes cookies:

#!C:\Python27\python.exe -u 

    import Cookie 
    c = Cookie.SimpleCookie() 
    c['id'] = '12345' 
    c['score'] = '8.76' 
    c['page'] = '3' 
    print "Content-type: text/html %s;\r\n" % (c) 
    print "" 
    print c 

Les problèmes sont les suivants:

  1. Seulement deux des trois valeurs de c indiquées ci-dessus sont stockées sous forme de cookies lorsque je vérifie " Afficher les cookies "dans Firefox après avoir exécuté le code ci-dessus par lui-même.
  2. La page sur laquelle j'arrive dans le script montre Content-type: text/html Set-Cookie: score=8.76 Set-Cookie: id=12345 Set-Cookie: page=3 ; en haut, en raison de la définition des cookies avec une instruction print et de l'envoi du type de contenu à nouveau. Lorsque cela se produit, aucun cookie n'est stocké dans mon navigateur. Les cookies ne sont stockés que si Content-type: text/html n'est pas déjà dans les en-têtes.

Y at-il un moyen de définir des cookies à l'intérieur de mon script sans imprimer une autre copie de Content-type: text/html au navigateur?

J'ai également besoin d'un moyen de mettre à jour les cookies de façon transparente lorsque l'utilisateur se déplace dans l'outil. Par exemple, lorsqu'ils cliquent sur la page suivante, le cookie est mis à jour au numéro de page suivant. J'utilise Python 2.7 sur Windows 10 et j'utilise Firefox comme navigateur de test.

Répondre

0

J'ai réussi à résoudre les deux problèmes. Problème n ° 1: Seules deux des trois valeurs c indiquées ci-dessus sont stockées en tant que cookies. Solution: J'ai configuré mon cookie de sorte que j'ai passé trois valeurs dans un cookie. Par exemple:

import Cookie 
c = Cookie.SimpleCookie() 
c['id'] = '12345|score=8.76|page=3' 

# Output the HTTP message containing the cookie BEFORE Content-type text/html! 
print c 
print "Content-type: text/html\r\n" 

Problème # 2: en-tête supplémentaire Content-type: text/html dans la sortie de la page Web:

Solution: Chaque fois que le serveur répond à un GET ou événement POST à ​​partir du navigateur, paramétrage du cookie doit être la première chose qui arrive dans la réponse http. J'ai dû réordonner la logique utilisée dans mon script pour m'assurer que c'était toujours le cas. Avec chaque réponse http, rien ne s'imprime dans le navigateur via Content-type: text/html jusqu'à APRES que le cookie soit pris en charge.