次の動作は python に固有の問題ですか (例外が発生した場合、ループ内の変数の値を変更することはできません)、またはチェリーピーの問題ですか (HTTPRedirect 例外が発生した場合、ループ内の変数の値を変更することはできません)。上げられます)?「outp」の値を「ORIGINAL」から「NEWVALUE」に変更しようとしています。
「Root(object)」というクラス内のメソッドとして次のコード スニペットを実行しています (読みやすいように 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 ステートメント内でのみ変更されます。例外をコメントアウトすると、「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 の問題であることがわかります。