Unboundlocal Error Google App Engine

时间:2012-05-18 06:07:45

标签: google-app-engine

我正在编写一个带有SEO友好网址的博客应用。当我访问无效的网址时,我收到以下错误:

  

UnboundLocalError:赋值前引用的局部变量'path'

有效的网址工作正常。

以下是代码:

class ViewPost(BaseHandler):
    def get(self, slug):
        post = Posts.all()
        post.filter('path =', slug)
        results = post.fetch(1)
        for post in results:
            path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')

以下是没有错误的valid和抛出错误的invalid的示例。您可以在invalid示例中看到完整的堆栈跟踪。

完整代码位于github第62行。

提前致谢。我是python的新手,所以我非常感谢你的帮助和反馈。

更新

  1. 对于上下文,我正在比较两个字符串以确定我是否有要投放的内容。

  2. 我期待看到的内容:如果slug和path相等,它应该呈现模板。如果不相等:它应该回复“没有这个slu post的帖子”消息。

  3. 我做过的其他事情。

    • 我已经确认我获得了一个slug和路径值。

    • 我尝试过像这样更改标识。

  4. 这阻止我收到错误,但我没有得到我的其他回复。相反,我得到一个空白页面,在视图源中没有任何内容。

    class ViewPost(BaseHandler):
    def get(self, slug):
        post = Posts.all()
        post.filter('path =', slug)
        results = post.fetch(1)
        for post in results:
            path = post.path
            if path == slug:
                self.render_template('post.html', {'post':post})
            else:
                self.response.out.write('no post with this slug')
    

1 个答案:

答案 0 :(得分:1)

在此版本的代码中,您会看到空白页面,因为从未输入for循环。由于slug无效,因此结果为null或为空。结果,永远不会达到if语句,这意味着if和else都不会触发。

class ViewPost(BaseHandler):
def get(self, slug):
    post = Posts.all()
    post.filter('path =', slug)
    results = post.fetch(1)
    for post in results:
        path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')

在此示例中,您的缩进设置的方式始终是if语句,无论slug如何。但是,如上例所示,结果为空或null。永远不会运行for循环,这意味着永远不会设置路径变量。

class ViewPost(BaseHandler):
    def get(self, slug):
        post = Posts.all()
        post.filter('path =', slug)
        results = post.fetch(1)
        for post in results:
            path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')

当尝试对path == slug进行比较时,这当然会导致以下错误消息:

  

UnboundLocalError:赋值前引用的局部变量'path'

基本上,要解决此问题,您需要使用值初始化路径,以便在没有赋值的情况下不引用它。将路径设置为默认值,保证与slug不同,如果slug没有导致有效记录,那么你的其他人将会触发。

<强>解决方案:

使用`path ='none``的示例,以及缩进设置,以便始终到达if语句。

class ViewPost(BaseHandler):
    def get(self, slug):
        path = 'none'
        post = Posts.all()
        post.filter('path =', slug)
        results = post.fetch(1)
        for post in results:
            path = post.path
        if path == slug:
            self.render_template('post.html', {'post':post})
        else:
            self.response.out.write('no post with this slug')