Forum Programmation.python problème python apache et utf8 [resolu]

Posté par  (site web personnel) .
Étiquettes :
0
15
juin
2012

Bonjour

J'ai une debian une sid (on verra plus tard pour la stable) avec un serveur apache.
Je souhaite afficher une page avec python3 (cgi).
Voici un ecm

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cgi,cgitb
cgitb.enable()

print('Content-Type: text/html;charset=utf-8')
print('''
<html>
    <head>
        <meta charset="utf-8" />
        <title>Test</title>
    </head>
    <body class="index">
        <div id="header">
            <h1>Test utf8 et python3</h1>
        </div>
        <div class="coeur">
            <p>aaaaaaaé</p>
        </div>
    </body>
</html>
        ''')

Jobtiens comme erreur
bash
[Fri Jun 15 11:59:13 2012] [error] [client ::1] (13)Permission non accord\xc3\xa9e: exec of '/home/jeanclaude/Documents/apache/python/test.py3' failed
[Fri Jun 15 11:59:13 2012] [error] [client ::1] Premature end of script headers: test.py3

évidemment c'est à cause de la lettre é (si je l'enlève il n'y a pas de problème).
Ma machine est en utf8j'utilise vim pour écrire.
Est ce que j'ai fait une faute dans mon ecm?

Merci de m'aider.

edit: la solution est de rajouter dans sa conf d'apache
python
AddDefaultCharset UTF-8
SetEnv PYTHONIOENCODING utf8

  • # sceptique

    Posté par  . Évalué à 2.

    Je suis sceptique sur la raison que tu invoques : "à cause de la lettre é".

    Peux-tu vérifier :
    - les droits d'exécution (ls -l /home/jeanclaude/Documents/apache/python/test.py)
    - si ton programme fonctionne tout seul (sans Apache) :
    /home/jeanclaude/Documents/apache/python/test.py
    puis:
    python3 /home/jeanclaude/Documents/apache/python/test.py

    • [^] # Re: sceptique

      Posté par  (site web personnel) . Évalué à 1.

      Et vérifie aussi que tu as bien mis dans la conf apache le
      Options +ExecCGI
      sur le répertoire en question avec les baslises Directory…

      Sinon pour info un accent aigue ca se met & eacute; ( sans l'espace) en html mister !

      Fuse : j'en Use et Abuse !

      • [^] # Re: sceptique

        Posté par  (site web personnel) . Évalué à 1.

        voila ce j'ai

        Alias /python /home/jeanclaude/Documents/apache/python
        <Directory /home/jeanclaude/Documents/apache/python>
        Options Indexes FollowSymLinks MultiViews ExecCGI
        DirectoryIndex index.py
        AddHandler cgi-script .cgi .py .py2 .py3
        AllowOverride None
        Order allow,deny
        allow from all
        </Directory>

        pour mon fichier test.py3

        $ ll test.py3
        -rwxr-xr-x 1 jeanclaude jeanclaude 379 juin 15 13:50 test.py3

        idem ca ne fonctionne pas si je fais $ chown www-data:www-data test.py3

        Vous pensez à des problèmes de droit d'accord mais pourquoi alors cela fonction que il n'y a pas la lettre é.

        Bon tu as raison je dois mettre & eacute.
        Est ce que ecm est bon?
        existe un bibliothèque python pour transformer é& eacute? je vais regarder de ce coté.

        • [^] # Je suis nul

          Posté par  (site web personnel) . Évalué à 0.

          oh oui, je suis nul c'était que ca

          remplacer é par & eacute;  !!!!!!!!!!!!!!!!!!!! pffffffff
          donc je repose la question y a t il en python quelque chose pour convertir en code html?

          merci encore

          • [^] # Re: Je suis nul

            Posté par  (site web personnel) . Évalué à 2.

            Pour convertir QUOI en code HTML ?

            Si c'est juste pour échapper les caractères (entre autre &), tu peux utiliser cgi.escape() sur le contenu à échapper (donc pas sur toute la page d'un coup, mais sur les parties contenu et attributs HTML).

            Sinon, pour tous les caractères accentués, symboles, marques… si tu indiques utf8, tu dois pouvoir les générer directement à ce format dans ton document sans avoir à te taper des & eacute ; (sinon à quoi ça sert d'encoder en utf8?).

            Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

            • [^] # problème contourné mais pas réglé

              Posté par  (site web personnel) . Évalué à 0.

              J'ai réglé ce que je voulais faire mon ordinateur

              Je pensais bien
              je vais cependant regarder cgi.escape()
              sinon bien sur je dois pouvoir écrire é et non & aecute c'est pourquoi j'ai été surpris que mon ecm ne marche pas avec python3

              merci de m'avoir consacré un peu de ton temps.

    • [^] # Re: sceptique

      Posté par  (site web personnel) . Évalué à 0.

      Re bonjour

      Mon programme fonctionne bien sans apache et quand je fais $ python3 test.py3 > test2.html la page se visualise bien.

      $ python3 /home/jeanclaude/Documents/apache/python/test.py3
      Content-Type: text/html;charset=utf-8
      
      <html>
          <head>
              <meta charset="utf-8" />
              <title>Test</title>
          </head>
          <body class="index">
              <div id="header">
                  <h1>Codage de Huffman</h1>
              </div>
              <div class="coeur">
                  <p>aaaaaaa é </p>
              </div>
          </body>
      </html>
      
      
  • # Au cas où

    Posté par  (site web personnel) . Évalué à 2.

    Je ne suis pas expert du CGI sous Python3, une question:

    Qui gère l'encodage de la réponse vers utf8 ?

    • un hook dans l'écriture sur stdout par les outils CGI en Python3 …
    • une conversion explicite (à faire) "truc".encode("utf-8")

    Sinon, ton erreur semble en effet n'avoir aucun rapport avec l'encodage, mais avec une "simple" interdiction d'exécution.

    Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

    • [^] # Un complément

      Posté par  (site web personnel) . Évalué à 2.

      Sur le problème de l'encodage du contenu dans une réponse sur stackoverflow avec Python 3 CGI encoding

      import locale                                  # Ensures that subsequent open()s 
      locale.getpreferredencoding = lambda: 'UTF-8'  # are UTF-8 encoded.
      
      import sys                                     
      sys.stdin = open('/dev/stdin', 'r')       # Re-open standard files in UTF-8 
      sys.stdout = open('/dev/stdout', 'w')     # mode.
      sys.stderr = open('/dev/stderr', 'w') 
      
      

      Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.