Python + Cherrypy - 为什么变量'outp'没有改变值?

时间:2012-10-10 20:09:06

标签: python cherrypy

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

1 个答案:

答案 0 :(得分:1)

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