2012-07-31 4 views
7

Jestem programistą. noobie i składam prostą stronę rejestracji jako ćwiczenie z użyciem Pythona w silniku GoogleApp.Obiekt 'unicode' nie jest wywoływalny

Gdy formularz rejestracyjny zostanie wypełniony niepoprawnie, program działa poprawnie. Gdy jest wypełniony prawidłowo, to ma przekierowanie do strony dziękuję, ale zamiast tego pojawia się błąd serwera:

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 

Moje pytanie jest dwojaki: (1) Co ten błąd oznacza? i (2) Skąd pochodzi?

Oto kod, minus 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

Podejrzewam, że przypadkowo nadpisałeś self.response obiektem unicode. Kiedy próbuje wywołać to później, próbuje wywołać twój ciąg. – Max

+0

Twoje wcięcie wydaje się po prostu zepsute, a ponieważ jest to Python, trudno jest komukolwiek powiedzieć, jaki masz zamiar. – millimoose

Odpowiedz

5

Webapp2 oczekuje zysków z metod obsługi (get/post) to be callable. Powodem jest to, że zamiast zmieniać obiekt odpowiedzi dostarczony Tobie, (self.response, który z kolei modyfikuje środowisko żądania), tworzysz jednostkę pracy w postaci odpowiedzi wywoływalnej, która następnie applied onto the environment of the request według framework.

Gdy użytkownik podłączy return username, framework spróbuje wywołać Twój nieobsługiwany obiekt Unicode (nazwa użytkownika).