2012-06-07 25 views
11

Estoy tratando de escribir mi primera aplicación en Google App Engine con Python (enlace de la aplicación: http://contractpy.appspot.com/ - es solo un experimento aplicación). El código completo está abajo.Python UnicodeDecodeError: códec 'ascii' no puede decodificar byte 0xe2 ordinal no en rango (128)

Pero, cuando envíe los datos, estoy recibiendo este error (demostrada en los registros):

(...) line 265, in get "contractType":geted_contractType 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 949: ordinal not in range(128) 

Línea 265 es en este caso el bloque:

self.response.out.write(yourcontract % {"resident":geted_resident_name, 
             "nacionality":geted_user_nacionality, 
             "SSN":geted_user_SSN, 
             "SSN_error":geted_SSN_error, 
             "driverLicense":geted_user_driverLicense, 
             "email":geted_user_email, 
             "witness ":geted_witness , 
             "owner":geted_owner, 
             "contractType":geted_contractType 
             }) 

Traté de hacer cambios, lea awnswers similares (como this o this), pero nada ayudó. No puedo entender en este código lo que está pasando mal. ¿Alguien puede descubrir qué está causando ese error y cómo solucionarlo?

Estoy usando Python 2.7.

¡Gracias de antemano por cualquier ayuda!

# -*- coding: utf-8 -*- 
# -*- coding: utf-8 -*- 
#!/usr/bin/env python 
# 
# Copyright 2007 Google Inc. 
# 
# Licensed under the Apache License, Version 2.0 (the "License"); 
# you may not use this file except in compliance with the License. 
# You may obtain a copy of the License at 
# 
#  http://www.apache.org/licenses/LICENSE-2.0 
# 
# Unless required by applicable law or agreed to in writing, software 
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
# See the License for the specific language governing permissions and 
# limitations under the License. 
# 

    import webapp2 

    form = """ 

    <html> 
     <head> 
     <title>Contract with Python</title> 
     <style type="text/css"> 
      .label {text-align: right} 
      .error {color: red} 
     </style> 

     </head> 

     <body> 
     <h2>Contract with Python</h2> 
     <form method="post"> 
      <table> 
      <tr> 
       <td class="label"> 
       resident 
       </td> 
       <td> 
       <input type="text" name="resident" value= "%(resident)s"> 
       </td> 
       <td class="error"> %(resident_error)s 

       </td> 
      </tr> 

      <tr> 
       <td class="label"> 
       nacionality 
       </td> 
       <td> 
       <input type="text" name="nacionality" value= " "> 
       </td> 
      </tr> 

      <tr> 
       <td class="label"> 
       License 
       </td> 
       <td> 
       <input type="text" name="driverLicense" value=""> 
       </td> 
      </tr> 

      <tr> 
       <td class="label"> 
       SSN 
       </td> 
       <td> 
       <input type="text" name="SSN" value="%(SSN)s"> 
       </td> 
       <td class="error"> %(SSN_error)s 
       </td> 
      </tr> 


      <tr> 
       <td class="label"> 
       Email (optional) 
       </td> 
       <td> 
       <input type="text" name="email" value="%(email)s"> 
       </td> 
       <td class="error"> %(email_error)s 

       </td> 
      </tr> 
      </table> 

    <br> 
      <td class="label"> 
       Contract Type 
       <select name = "contractType"> 
        <option>House Rental Contract</option> 
        <option>Car Rental Contract</option> 
        <option>Other</option> 
       </select> 
       </td> 
    <br> 
    <br> 

    <br> 
       owner 
       <select name = "owner"> 
        <option>House owner</option> 
        <option>Car owner</option> 
        <option>Other owner</option> 
       </select> 
    <br> 
    <br> 

    <br> 
       Witness 
       <select name = "witness"> 
        <option>Carl Sagan</option> 
        <option>Mahatma Gandhi</option> 
       </select> 
    <br> 
    <br> 

      <input type="submit"> 
     </form> 
     </body> 

    </html> 
    """ 

    yourcontract = """ 
    <html> 
     <head> 
     <title>Unit 2 Signup</title> 
     </head> 

     <body> 

    %(contractType)s 

    In consideration of the agreements of the Resident(s), known as: %(resident)s The owner hereby rents them the dwelling located at %(residentAdress)s, for the period commencing on the %(dateStarts)s, and monthly thereafter until the last day of %(dateEnds)s, at which time this Agreement is terminated. Resident(s), in consideration of owners permitting them to occupy the above property, hereby agrees to the following terms: 

    RENT: To pay as rental the sum of $ (rentalSum) per month, due and payable in advance from the first day of every month. Failure to pay rent when due will result in the owner taking immediate legal action to evict the Resident from the premises and seize the security deposit. 
    LATE FEE: Rent received after the first of the month will be subject to a late fee of 10% plus (3.00) dollars per day. 

    ACCEPTED THIS (dateContract), at (localContract). 

    ___________________________________________________ 
    %(resident)s - Resident 

    ___________________________________________________ 
    %(owner)s – owner 

    ___________________________________________________ 
    %(witness)s – Witness 

     </body> 
    </html> 

    """ 

    import re 

    USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$") 
    def valid_resident(resident): 
     return USER_RE.match(resident) 

    PASS_RE = re.compile(r"^.{3,20}$") 
    def valid_SSN(SSN): 
     return PASS_RE.match(SSN) 

    EMAIL_RE = re.compile(r"^[\S][email protected][\S]+\.[\S]+$") 
    def valid_email(email): 
     return EMAIL_RE.match(email) 

    def escape_html(s): 
     for (i,o) in (("&","&"), (">",">"), ("<","<"), ('"','"')): 
      s = s.replace(i,o) 
      return s 

    import time 

    import datetime 

    def dateToday(): 
     today = datetime.datetime.today() 
     todayDay = str(today.day) 
     todayMonth = str(today.month) 
     monthExt = {'1':' January ', '2':'February', '3':' March ', '4':'April', '5':'May', '6':'June', '7 ':' July ', '8':'August', '9':'September', '10':'October', '11':'November ', '12':'December'} 
     todayYear = str(today.year) 
     return(todayDay + ' of ' + monthExtenso[todaymonth] + ' of ' + todayYear) 

    class MainHandler(webapp2.RequestHandler): 
     def get(self): 
      self.response.out.write(form %{"resident": "", 
              "SSN": "", 
              "driverLicense": "", 
              "email":"", 
              "resident_error": "", 
              "SSN_error": "", 
              "driverLicense_error": "", 
              "email_error": ""}) 

     def write_form(self, text_write): 
      self.response.out.write(text_write) 

     def post(self): 
      resident_name = self.request.get(escape_html("resident")) 
      user_nacionality = self.request.get("nacionality") 
      user_SSN = self.request.get(escape_html('SSN')) 
      user_email = self.request.get(escape_html('email')) 
      user_driverLicense = self.request.get(escape_html('driverLicense')) 
      resident_error = "" 
      SSN_error = "" 
      driverLicense_error = "" 
      contract_type = self.request.get("contractType") 
      owner = self.request.get("owner") 
      witness = self.request.get("witness ") 

      if (resident_name and valid_resident(resident_name)) \ 
      and (user_SSN and valid_SSN(user_SSN)) \ 
      and ((not user_email) or (user_email and valid_email(user_email))): 
       self.redirect('/yourcontract?resident=%s&nacionality=%s&SSN=%s&driverLicense=%s&email=%s&witness=%s&owner=%s' % (resident_name, user_nacionality, user_SSN, user_driverLicense, user_email, 
    witness, owner)) 
      else: 
       if not valid_resident(resident_name): 
        resident_error = "Oh no!!! this resident name isn't valid!" 
       if not valid_SSN(user_SSN): 
        SSN_error = "Oh no!!! SSN isn't valid!" 
       if user_email and not valid_email(user_email): 
        email_error = "Oh no!!! e-mail isn't valid!" 
       self.write_form(form % {"resident":resident_name, 
              "resident_error":resident_error, 
              "SSN":user_SSN, 
              "SSN_error":SSN_error, 
              "driverLicense":user_driverLicense, 
              "email":user_email, 
              }) 

    class yourcontractHandler(webapp2.RequestHandler): 
     def get(self): 
      geted_resident_name = self.request.get('resident') 
      geted_user_nacionality = self.request.get("nacionality") 
      geted_user_SSN = self.request.get('SSN') 
      geted_user_email = self.request.get('email') 
      geted_user_driverLicense = self.request.get('driverLicense') 
      geted_resident_error = "" 
      geted_SSN_error = "" 
      geted_driverLicense_error = "" 
      #geted_contract_type = self.request.get("contractType") 
      geted_owner = self.request.get("owner") 
      geted_witness = self.request.get("witness") 
      geted_contractType = self.request.get("contractType") 



      self.response.out.write(yourcontract % {"resident":geted_resident_name, 
              "nacionality":geted_user_nacionality, 
              "SSN":geted_user_SSN, 
              "SSN_error":geted_SSN_error, 
              "driverLicense":geted_user_driverLicense, 
              "email":geted_user_email, 
              "witness ":geted_witness , 
              "owner":geted_owner, 
              "contractType":geted_contractType 
              }) 


    app = webapp2.WSGIApplication([('/', MainHandler), ('/yourcontract', yourcontractHandler)], 
            debug=True) 
+3

Comprueba esto: http://bit.ly/unipain – Daenyth

+0

has intentado codificar ('utf-8'), puede resolver tu problema –

Respuesta

6

Realmente debe utilizar un sistema de plantillas adecuado. Jinja2 está incluido con App Engine.

Sin embargo, mientras tanto su problema es que sus plantillas son ASCII pero sus datos no son (no puede decir si es utf-8 o unicode). La solución más fácil es ponerle un prefijo a cada cadena de plantilla con u para que sea Unicode.

Pero, realmente debería usar un sistema de plantillas adecuado.

+0

Hola, @Daniel Roseman, empiezo a usar jinja2, pero, sé, estoy pegado con t su error: http://stackoverflow.com/questions/11072478/python-unicodedecodeerror-utf8-codec-cant-decode-byte-unexpected-code-byt ¿Podría proporcionarnos alguna ayuda? ¡Gracias de nuevo! – craftApprentice

4

Aquí tienes la solución.

>>> "t".decode("utf-8") 
u't' 
>>> "\x81".decode("utf-8") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "encodings/utf_8.py", line 7799, in decode 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte 

>>> "a\x81b".decode("utf-8", "replace") # this will decode better and the right way. 
u'a\ufffdb' 
+2

La codificación en su ejemplo no ha ido mejor. Todo lo que ha logrado es reemplazar un carácter no ASCII por [carácter Unicode FFFD] (http://www.fileformat.info/info/unicode/char/fffd/index.htm). No puedo imaginar que el que pregunta quisiera que este personaje apareciera en sus datos. –

1

Conjunto codificador por defecto en la parte superior de su código

En appcfg.py que reside en el interior /google/appengine/tools/appcfg.py

en la línea 73 añadir

import sys 
reload(sys) 
sys.setdefaultencoding("ISO-8859-1") 
+0

esta fue la única solución que funcionó para mí, probé las otras dos y no funcionaron. gracias. – jimh

Cuestiones relacionadas