以下行为是python固有的问题(如果引发异常,则无法更改循环内变量的值)或者它是cherrypy的问题(如果不能在循环内更改变量的值,则引发了HTTPRedirect异常)?我试图将'outp'的值从'ORIGINAL'更改为'NEWVALUE'。
我正在运行以下代码片段作为名为“Root(object)”的类中的方法(打印语句突出显示以便于阅读):
@cherrypy.expose
def tester(self, cancel=False, submit=False, clear=False, **data):
outp = "ORIGINAL"
if cherrypy.request.method == 'POST':
print outp ############ FIRST PRINT STATEMENT ##########
if True:
outp = "NEWVALUE"
print outp + '1' ############ SECOND PRINT STATEMENT #########
raise cherrypy.HTTPRedirect('/tester')
print outp + '2' ############ THIRD PRINT STATEMENT ##########
tmpl = loader.load('tester.html')
stream = tmpl.generate(outp=outp)
return stream.render('html', doctype='html')
我收到以下输出:
ORIGINAL
NEWVALUE1
127.0.0.1 - - [10/Oct/2012:15:45:33] "POST /tester HTTP/1.1" 303 102
"http://localhost:8080/tester" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.7)
Gecko/20120829 Firefox/10.0.7"
ORIGINAL2
outp的值仅在if语句中更改。如果我注释掉异常提升“raise cherrypy.HTTPRedirect('/ tester')”:
@cherrypy.expose
def tester(self, cancel=False, submit=False, clear=False, **data):
outp = "ORIGINAL"
if cherrypy.request.method == 'POST':
print outp ############ FIRST PRINT STATEMENT ##########
if True:
outp = "NEWVALUE"
print outp + '1' ############ SECOND PRINT STATEMENT #########
#raise cherrypy.HTTPRedirect('/tester')
print outp + '2' ############ THIRD PRINT STATEMENT ##########
tmpl = loader.load('tester.html')
stream = tmpl.generate(outp=outp)
return stream.render('html', doctype='html')
我收到以下输出:
ORIGINAL
NEWVALUE1
NEWVALUE2
我不一定在寻找一个深入的答案,只是想知道这是由Python引起的行为还是Cherrypy导致的行为。我无法通过将代码片段转换为自己的Python脚本来模仿行为,因此有迹象表明它是一个Cherrypy问题。
答案 0 :(得分:1)
Python,主要是。与任何Python异常一样,HTTPRedirect暂停该函数的执行。 HTTPRedirect本质上是告诉客户端发出另一个HTTP请求,它将再次运行该函数,而不会从中断处继续。异常不是循环:每次运行时,该函数的任何本地变量都将是新的。