获取参数错误,“名称未定义”

时间:2015-05-09 21:02:32

标签: python google-app-engine

我正试着在我的网页上找到这个迷你留言页面。这是我的Python代码(使用谷歌应用程序引擎),我一直在回复“post = Posts(parent = wall_key(wall_name))< ----这是说没有定义wall_name?”我没有在页面顶部定义它吗?顺便说一下,我对编程非常陌生,你可能会说。

Traceback (most recent call last):

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle

    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler

    handler, path, err = LoadObject(self._handler)

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject

    obj = __import__(path[0])

  File "E:\Documents\stage_4_work_session_2\work_session_4.py", line 159, in <module>

    class guestbookHandler(myHandler):

  File "E:\Documents\stage_4_work_session_2\work_session_4.py", line 178, in guestbookHandler

    post = Post(parent=wall_key(wall_name))

NameError: name 'wall_name' is not defined

INFO     2015-05-09 19:18:06,483 module.py:737] default: "GET /favicon.ico HTTP/1.1" 500 -

这是错误

class myHandler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.write(*a, **kw)

    def render_str(self, template, **params):
        template = jinja_env.get_template(template)
        return template.render(params)

    def render(self, template, **kw):
        self.write(self.render_str(template,**kw))


#This code identifies the name of the wall
DEFAULT_WALL='Public'
def wall_key(wall_name=DEFAULT_WALL):
    return ndb.Key('Wall', wall_name)
#This Post class sets up the model for my datastore
class Post(ndb.Model):
    guest_name=ndb.StringProperty(indexed=False)    
    guest_message=ndb.StringProperty(indexed=False)
    date=ndb.DateTimeProperty(auto_now_add=True)

这是myHandler信息

{{1}}

2 个答案:

答案 0 :(得分:0)

request.get() -

  

请求对象提供了一个返回值的get()方法   从查询和POST数据中解析出的参数。

因此request.get()从您的html代码中获取POST表单中的数据,而不是从您的python应用程序文件中获取数据。为此,通常,您的html代码中应该有一个包含name="wall_name"字段的表单。或者发送包含wall_name参数的查询字符串。您的错误表明您的请求中没有参数wall_name

其次,如果要在get()方法中使用参数的默认值,则应使用default_value参数:

wall_name = self.request.get('wall_name',default_value = DEFAULT_WALL)

P.S。如果你输入你的html代码也会有所帮助。

答案 1 :(得分:-1)

我不知道这是否是导致错误的直接原因,但我注意到了这一点:

def post(self):
    wall_name = self.request.get('wall_name',DEFAULT_WALL)
    post = Post(parent=wall_key(wall_name))

你有一个与它所用函数同名的局部变量。这不好。 best 会发生什么事情,该函数将能够运行一次,但它将不再是一个函数,因为它的名称被覆盖了。

编辑:实际上,我用一个小函数对它进行了测试,并没有像我期望的那样失败,但我仍然认为更改变量名称是个好主意。 ..

您应该更改该变量的名称(post),并且更改Post类的名称可能也没有什么坏处。称之为描述性内容,例如GuestBook_Post

更新:我运行代码时无法重现“wall_name未定义”错误。您可以import logging然后在问题行前面用wall_name记录logging.debug()的值,这可能会对情况有所了解。