2012-07-31 32 views
7

Tôi là nhà phát triển web. noobie và tôi đang đặt cùng một trang đăng ký đơn giản như thực hành bằng cách sử dụng Python trên GoogleApp Engine.đối tượng 'unicode' không thể gọi được

Khi biểu mẫu đăng ký được điền không chính xác, chương trình hoạt động tốt. Khi nó được điền chính xác, nó là nghĩa vụ phải chuyển hướng đến một trang cảm ơn nhưng thay vào đó tôi nhận được một lỗi server:

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 

Câu hỏi của tôi là hai lần: (1) không lỗi này có ý nghĩa gì? và (2) Nó đến từ đâu?

Dưới đây là các mã, trừ 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

Tôi nghi ngờ một nơi nào đó bạn đã vô tình ghi đè self.response với đối tượng unicode. Khi nó cố gắng gọi nó sau này, nó cố gắng gọi chuỗi của bạn. – Max

+0

Thụt lề của bạn có vẻ khá bị hỏng, và đây là Python khó mà ai khác biết được ý định của bạn là gì. – millimoose

Trả lời

5

webapp2 hy vọng lợi nhuận từ các phương pháp xử lý (nhận/bưu điện) to be callable. Lý do được thực hiện là thay vì thay đổi đối tượng phản hồi được cung cấp cho bạn, (self.response, do đó sửa đổi môi trường của yêu cầu), bạn xây dựng một đơn vị công việc dưới dạng một phản hồi có thể gọi, sau đó applied onto the environment of the request theo khuôn khổ.

Khi bạn return username khuôn khổ cố gắng gọi đối tượng unicode không thể đọc được của bạn (tên người dùng).

Các vấn đề liên quan