"unicode" 对象不可调用。

7
我是一名网络开发新手,正在使用GoogleApp Engine上的Python练习制作一个简单的注册页面。
当填写的注册表单不正确时,程序可以正常运行。但当填写正确时,页面应该重定向到一个感谢页面,但实际上我却得到了一个服务器错误。
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

我的问题有两个方面:(1) 这个错误是什么意思?(2) 它来自哪里?

这是代码,不包括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]+@[\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
我怀疑你在某处意外地用unicode对象覆盖了self.response。当程序尝试在后面调用它时,会尝试调用你的字符串。 - Max
你的缩进似乎有些混乱,而且由于这是Python语言,其他人很难理解你的意图。 - millimoose
1个回答

5
Webapp2期望处理程序方法(get / post)的返回值是可调用的。这样做的原因是,您不会更改提供给您的响应对象(self.response,从而修改请求的环境),而是构造一个可调用响应的工作单元,然后由框架应用于请求的环境
当您return username时,框架尝试调用您的不可调用unicode对象(username)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接