2012-07-31 36 views
7

Soy un desarrollador web. noobie y estoy armando una página de registro simple como práctica usando Python en GoogleApp Engine.El objeto 'unicode' no se puede llamar

Cuando el formulario de registro se llena de manera incorrecta, el programa funciona bien. Cuando se ha llenado correctamente, se supone que debe redirigir a una página de agradecimiento que sino me sale un error del servidor:

Internal Server Error 

The server has either erred or is incapable of performing the requested operation. 

Traceback (most recent call last): 
    File  "/Users/bendavidow/Desktop/Stuff/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEng ine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1547, in __call__ 
return response(environ, start_response) 
TypeError: 'unicode' object is not callable 

Mi pregunta es doble: (1) ¿Qué significa este error? y (2) ¿De dónde viene?

Aquí está el código, menos el html:

import webapp2 
import re 
import cgi 
def escape_html(s): 
    return cgi.escape(s, quote = True) 

class MainPage(webapp2.RequestHandler): 
    def write_form(self, username = "", email = "", username_error = "", password_error = "", verify_error = "", email_error = ""): 
    self.response.out.write(form %{"username": escape_html(username), "email": escape_html(email), "username_error": username_error, "password_error": password_error, "verify_error": verify_error, "email_error": email_error}) 

def get(self): 
    self.write_form() 

def post(self): 
    username = self.request.get('username') 
    password = self.request.get('password') 
    verify = self.request.get('verify') 
    email = self.request.get('email') 


    username_check = re.search(r'^[a-zA-Z0-9_-]{3,20}$', username) 
    password_check = re.search(r'^.{3,20}$', password) 
    email_check = re.search(r'^[\S][email protected][\S]+\.[\S]+$',email) 


    username_error, password_error, email_error, verify_error = "", "", "", "" 
    if not username_check: 
     username_error = "Invalid Username" 
    if not password_check: 
     password_error = "Invalid Password" 
    if email != '' and not email_check: 
     email_error = "Invalid Email" 
    if password != verify: 
     verify_error = "Passwords do not match" 

    if username_error or password_error or email_error or verify_error: 
     self.write_form(username, email, username_error, password_error, verify_error, email_error) 
    else: 
     return username 
     self.redirect("/thanks") 


class ThanksHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.out.write("Welcome " + username) 

app = webapp2.WSGIApplication([('/', MainPage), ('/thanks',ThanksHandler)], debug = True) 
+3

sospecho algún lugar usted ha sobrescrito accidentalmente self.response con un objeto Unicode. Cuando intenta llamarlo más tarde, intenta llamar a su cadena. – Max

+0

Tu sangrado parece bastante roto por cierto, y siendo Python, es difícil para cualquier otra persona decir cuál fue tu intención. – millimoose

Respuesta

5

webapp2 espera que los rendimientos de los métodos de controlador (GET/POST) to be callable. La razón por la que se hace es para que en lugar de alterar el objeto de respuesta que se le proporcione (auto respuesta, que a su vez modifique el entorno de la solicitud) construya una unidad de trabajo en forma de respuesta invocable, que es entonces applied onto the environment of the request por el marco.

Cuando return username el marco intenta invocar el objeto Unicode uncallable (nombre de usuario).

Cuestiones relacionadas