2017-10-13 16 views
1

Je courais un serveur apache qui sert un cadre appelé ingeniousencodeur par défaut de Ecraser python3 lorsque vous utilisez le serveur apache

Obtenir UnicodeDecodeError('ascii' lors de la lecture d'un fichier avec les caractères hébraïques.

J'ai lu que vous pouvez modifier le codage préféré par défaut de python3 en utilisant des variables d'environnement.

Je l'ai modifié /etc/httpd/conf/httpd.conf en utilisant la méthode [setenv] [3]:

SetEnv LC_ALL en_US.UTF-8 
SetEnv LANG en_US.UTF-8 
SetEnv LANGUAGE en_US.UTF-8 
SetEnv PYTHONIOENCODING utf8 

et redémarrez le serveur en utilisant sudo service httpd restart et ne fonctionne toujours pas.

Je dois dire que le logiciel fonctionne localement lorsqu'il ne fonctionne pas avec un serveur apache, simplement python3.

locale.getpreferredencoding() est ANSI_X3.4-1968 après le changement

ici est le contenu de /etc/httpd/conf/httpd.conf

ServerRoot "/etc/httpd" 

Listen 80 

Include conf.modules.d/*.conf 

User apache 
Group apache 

ServerAdmin [email protected] 

<Directory /> 
    AllowOverride none 
    Require all denied 
</Directory> 
ErrorLog "logs/error_log" 

LogLevel warn 

<IfModule log_config_module> 
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
    LogFormat "%h %l %u %t \"%r\" %>s %b" common 

    <IfModule logio_module> 
     # You need to enable mod_logio.c to use %I and %O 
     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio 
    </IfModule> 

    CustomLog "logs/access_log" combined 
</IfModule> 

<IfModule alias_module> 
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 

</IfModule> 


<IfModule mime_module> 
    AddType text/html .shtml 
    AddOutputFilter INCLUDES .shtml 
</IfModule> 


AddDefaultCharset UTF-8 

<IfModule mime_magic_module> 

    MIMEMagicFile conf/magic 
</IfModule> 

EnableSendfile On 

# Supplemental configuration 

LoadModule wsgi_module /usr/lib64/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so 

WSGIScriptAlias/"/usr/bin/inginious-webapp.production" 
WSGIScriptReloading On 

Alias /static/common /usr/lib/python3.5/site-packages/inginious/frontend/common/static/ 
Alias /static/webapp /usr/lib/python3.5/site-packages/inginious/frontend/webapp/static/ 
Alias /static/lti /usr/lib/python3.5/site-packages/inginious/frontend/lti/static/ 

SetEnv LC_ALL en_US.UTF-8 
SetEnv LANG en_US.UTF-8 
SetEnv LANGUAGE en_US.UTF-8 
SetEnv PYTHONIOENCODING utf8 

<Directory "/usr/bin"> 
    <Files "inginious-webapp.production"> 
     Require all granted 
    </Files> 
</Directory> 

<DirectoryMatch "/usr/lib/python3.5/site-packages/inginious/frontend/(.+)/static/"> 
    Require all granted 
</DirectoryMatch> 


IncludeOptional conf.d/*.conf 

comment puis-je déboguer plus cela?

Répondre

1

Lire:

Cela explique les problèmes autour de lang/locale.

Vous n'utilisez pas le mode démon mod_wsgi, mais vous devriez être en mode démon.

aller aussi lire la documentation mod_wsgi à:

+0

Merci pour la réponse. Je n'ai pas le contrôle de la partie devops de ce projet, j'en ai peur. mais merci pour l'astuce concernant le démon mod_wsgi – WebQube

1

Python3 utilise ce que local.getpreferredencoding renvoie comme codage lors de l'ouverture de fichiers en mode texte. Je suggère d'ajouter un enregistrement et de consigner la valeur de codage par défaut pour vérifier si c'est l'environnement qui n'est pas configuré correctement.

Il se peut qu'il y ait un paramètre de codage codé en dur quelque part dans le code. Pouvez-vous montrer la stacktrace de l'erreur et le code correspondant? En fonction du mécanisme de déploiement, il se peut que la configuration SetEnv ne soit pas transmise à Python. Voir http://ericplumb.com/blog/passing-apache-environment-variables-to-django-via-mod_wsgi.html pour les déploiements mod_wsgi.

Semblable à ce qui est décrit dans ce billet de blog, vous devez modifier le fichier inginious-webapp.production pour obtenir et définir les variables d'env manuellement. Ceci est déjà fait dans la valeur par défaut inginious-webapp pour certaines variables. Ici, vous devez ajouter en particulier PYTHONIOENCODING.

Si vous utilisez le mode mod_wsgi deamon, cela peut aider http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html, en particulier les paramètres lang ou locale.

+0

locale.getpreferredencoding() est 'ANSI_X3.4-1968' après le changement. mis à jour la question. valeurs codées en dur - j'en doute car il fonctionne correctement sur ma machine locale – WebQube

+0

Évidemment, les paramètres d'env ne le rendent pas dans le contexte de Python. Quelle méthode de déploiement utilisez-vous, mod_wsgi? – Bernhard

+0

Comment le savoir? Quel déploiement? – WebQube