9
votes

Envoi de "Set-Cookie" dans un serveur HTTP Python

Comment puis-je envoyer l'en-tête "Set-Cookie" lorsque vous travaillez avec un basehttpServerreQuestHandler et cookie ? basecookie et les enfants ne fournissent pas de méthode de sortie la valeur à transmettre dans send_header () et * cookie.output () fait Ne pas fournir un délimiteur http ligne.

Quel Cookie La classe dois-je utiliser? Deux ont survécu à Python3, quelles sont les différences?


0 commentaires

3 Réponses :


2
votes

Utilisez c = http.cookie.simplecookie pour maintenir les cookies, puis c.output () pour créer les en-têtes pour cela.

Exemple ici

Le gestionnaire de requête a un WFILE attribut, qui est la prise. xxx


8 commentaires

@Tor Cet envoi ne fonctionne pas, SimpleCookie ne produit pas un en-tête complet


Bien sûr, vous devez ajouter plus d'en-têtes que les cookies ... Je pensais que c'était évident.


Non, la sortie du cookie n'est pas valide pour écrire soit sur self.wfile dans le gestionnaire ou à auto.send_header ()


@Tor. Je connais l'exemple que vous avez donné looks à droite, mais si vous essayez réellement, vous verrez de quoi je parle.


L'exemple que j'ai donné est de l'exemple de lien au-dessus de celui-ci .. L'exemple général est extrait de la source de basehttpequestHandler ...


Self.Send_header ('Set-Cookie', C.Output (Header = '')) Travaille. L'a eu d'ici. B.LEPPOC.net/2010/02/12/Simple -webserver-in-python gênant ce n'est pas documenté dans le http.server.html ou le http.cokies.html Python Docs ..


Il semble depuis Python 3.3, send_response () écrit sur un tampon interne, qui est envoyé sur le serveur uniquement lorsque end_headers () est appelé (voir Cette note dans Send_Response () Documentation . Cela signifie que vous ne peut plus ajouter un en-tête avec wfile.write , si d'autres en-têtes sont ajoutés avec Send_Response () . C'est la raison pour laquelle cela ne fonctionne pas avec Python> = 3.3.


Vous pouvez également affleurer la mémoire tampon d'en-tête en utilisant flush_headers () .



1
votes

J'ai utilisé le code ci-dessous, qui utilise SimpleCookie de http.cookies pour produire un objet pour un cookie. Ensuite, j'ajoute une valeur à cela, et enfin, je l'ajoute à la liste des en-têtes Pour envoyer (en tant que champ Set-Cookie ) avec l'habituel send_header : xxx

Les paramètres de cookie.output < / code> sont importants:

  • en-tête = '' garantit qu'aucun en-tête n'est ajouté à la chaîne qu'elle produit (si non terminé, il produira une chaîne qui commencera par Set-Cookie: , qui fera des cordes comme celle dans la même en-tête, puisque send_header ajoutera le sien).
  • sep = '' ne provoque aucun séparateur final.

1 commentaires

Cela ne fonctionnera que s'il n'y aura qu'un seul cookie à une fois écrit



4
votes

Ceci envoie une en-tête Set-Cookie pour chaque cookie

    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")

        cookie = http.cookies.SimpleCookie()
        cookie['a_cookie'] = "Cookie_Value"
        cookie['b_cookie'] = "Cookie_Value2"

        for morsel in cookie.values():
            self.send_header("Set-Cookie", morsel.OutputString())

        self.end_headers()
        ...


1 commentaires

Cette réponse doit être acceptée. D'autres sont incomplets.