我正在编写一个带有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的新手,所以我非常感谢你的帮助和反馈。
更新
对于上下文,我正在比较两个字符串以确定我是否有要投放的内容。
我期待看到的内容:如果slug和path相等,它应该呈现模板。如果不相等:它应该回复“没有这个slu post的帖子”消息。
我做过的其他事情。
我已经确认我获得了一个slug和路径值。
我尝试过像这样更改标识。
这阻止我收到错误,但我没有得到我的其他回复。相反,我得到一个空白页面,在视图源中没有任何内容。
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')
答案 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')