1

以下行为是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 问题。

4

1 回答 1

1

Python,主要是。HTTPRedirect 与任何 Python 异常一样,会暂停函数的执行。HTTPRedirect 本质上是告诉客户端发出另一个 HTTP 请求,这将再次运行该函数,而不会从中断的地方继续。异常不是循环:每次运行该函数时,该函数的任何本地变量都是新的。

于 2012-10-10T21:26:41.023 回答