1

次の動作は 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 の問題であることがわかります。

4

1 に答える 1

1

パイソン、ほとんど。HTTPRedirect は、他の Python 例外と同様に、関数の実行を中断します。HTTPRedirect は基本的に、別の HTTP 要求を作成するようにクライアントに指示します。これにより、中断したところから続行せずに関数を 2 回実行します。例外はループではありません。その関数にローカルな変数は、実行するたびに新しくなります。

于 2012-10-10T21:26:41.023 に答える