2012-10-10 126 views
1

以下行爲是python固有的問題(如果發生異常,不能更改循環內某個變量的值)或者它是cherrypy的問題(​​如果一個循環中的某個變量的值不能更改HTTPRedirect異常被引發)?我正在嘗試將'outp'的值從'ORIGINAL'更改爲'NEWVALUE'。Python + Cherrypy - 爲什麼變量'outp'沒有改變值?

我運行下面的代碼片段作爲一個叫做類中的方法「根(對象)」(print語句被突出顯示,方便閱讀):

@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語句內發生變化。如果我註釋掉異常養「養cherrypy.HTTPRedirect(‘/測試’)」:

@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

Python,主要是。與任何Python異常一樣,HTTPRedirect會暫停該函數的執行。 HTTPRedirect實質上是告訴客戶端發出另一個HTTP請求,這個請求會再次運行該功能,而不會從停止的地方繼續運行。異常不是循環:每次運行時,該函數的局部變量都是新的。

+0

太棒了。謝謝回覆。我有一種感覺,HTTPRedirect異常是問題所在。 – henryalphabet

相關問題