2012-10-10 2 views
1

다음 동작은 파이썬 고유의 문제입니다 (예외가 발생하면 루프 내의 변수 값을 변경할 수 없음). 또는 체리 피와 관련된 문제입니다 (루프가 끝나면 루프 내의 변수 값을 변경할 수 없습니다. HTTPRedirect 예외가 발생했습니다.)? 'outp'값을 'ORIGINAL'에서 'NEWVALUE'로 변경하려고합니다.Python + Cherrypy - 변수 'outp'가 값을 변경하지 않는 이유는 무엇입니까?

나는라는 클래스 내에서 방법으로 다음과 같은 코드를 실행하고 "루트 (객체)"(인쇄 문은 쉽게 읽기 강조) :

: 나는 다음과 같은 출력이 나타납니다

@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 인상"

ORIGINAL 
NEWVALUE1 
NEWVALUE2 

내가 반드시 깊이에서 찾는 게 아니에요 : 나는 다음과 같은 출력이 나타납니다

@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') 

을 답은 파이썬이 행동을 일으켰는지 아니면 체리 피가 행동을 일으켰는지에 대한 아이디어 일뿐입니다. 코드 스 니펫을 자체 Python 스크립트로 변환하여 동작을 모방 할 수 없으므로 징후가 Cherrypy 문제입니다.

답변

1

대부분이 파이썬입니다. HTTPRedirect는 파이썬 예외와 마찬가지로 함수의 실행을 일시 중단합니다. HTTPRedirect는 본질적으로 클라이언트가 다른 HTTP 요청을하도록 지시합니다.이 요청은 중단 된 부분부터 계속하지 않고 두 번째 기능을 실행합니다. 예외는 루프가 아닙니다. 함수를 실행할 때마다 해당 함수의 로컬 변수가 새로운 값이됩니다.

+0

굉장합니다. 답장을 보내 주셔서 감사합니다. HTTPRedirect 예외가 문제라고 생각했습니다. – henryalphabet

관련 문제